rational
Выполняет рациональную аппроксимацию комплексных данных, зависящих от частоты.
| Библиотека |
|
Описание
Используйте функцию rational для выполнения рациональной аппроксимации комплексных данных, зависящих от частоты. Данная функция использует алгоритм AAA [1] для построения рациональной аппроксимации с комплексными частотами . Алгоритм AAA использует барицентрическую форму для решения проблем масштабирования, с которыми сталкиваются другие методы рациональной аппроксимации, в частности, широко используемый алгоритм векторной аппроксимации. Это позволяет алгоритму AAA быстро сходиться к почти оптимальной рациональной функции аппроксимации. Аппроксимация каждого элемента функции rational задается следующим уравнением:
где
-
— вычеты;
-
— полюса;
-
— свободный член.
Синтаксис
Вызов функции
-
fit = rational()— создает неотражающий однопортовый объектrational, свойства которого заданы по умолчанию.
-
fit = rational(___,Name=Value)— задает параметры для управления аспектами аппроксимации или устанавливает свойства объектаrationalс помощью аргументов типа «имя-значение».
Аргументы
Входные аргументы
#
freq —
неотрицательные частоты
вектор
Details
Неотрицательные частоты в Гц, заданные как вектор.
| Типы данных |
|
#
s —
N-портовые S-параметры
объект sparameters
Details
N-портовые S-параметры, заданные как объект sparameters.
#
filename —
имя файла сетевых данных
строка
Details
Имя файла сетевых данных, заданное как строка. Файл данных должен иметь расширение .snp (файл Touchstone).
#
tol —
допустимая относительная погрешность
−40 (по умолчанию) | скаляр
Входные аргументы «имя-значение»
Укажите необязательные пары аргументов в виде Name=Value, где Name — имя аргумента, а Value — соответствующее значение. Аргументы типа «имя-значение» должны располагаться после других аргументов, но порядок пар не имеет значения.
Пример: fit = rational(s, MaxPoles = 1002) устанавливает максимальное количество полюсов для аппроксимации. Можно указать несколько пар «имя-значение».
#
Tolerance —
допустимая относительная погрешность
−40 (по умолчанию) | скаляр
#
TendsToZero —
поведение аппроксимации при больших значениях S-параметров
true (по умолчанию) | false
Details
Поведение аппроксимации при больших S-параметров, заданное одним из логических значений:
-
true— свободный член в аппроксимации обнуляется, так что рациональная аппроксимация стремится к нулю по мере приближения к бесконечности; -
false— допускается ненулевой свободный член.
| Типы данных |
|
#
MaxPoles —
максимальное количество полюсов
1000 (по умолчанию) | скаляр
Details
Максимальное количество полюсов, заданное как неотрицательное целое число.
| Типы данных |
|
#
ErrorMetric —
метрика ошибок в объекте rational
"default" (по умолчанию) | "Relative"
Details
Метрика ошибок в объекте rational, заданная одним из следующих способов:
-
"default"— объектrationalбудет равномерно распределять ошибку; -
"Relative"— объектrationalбудет соответствовать как пикам, так и впадинам, или получать меньшую ошибку для меньших значений.
| Типы данных |
|
#
NoiseFloor —
игнорирование низкоуровневого шума в данных
−Inf (по умолчанию) | скаляр
Details
Аргумент, позволяющий игнорировать низкоуровневый шум в данных, заданный как скаляр.
| Типы данных |
|
#
Causal —
устойчивость полюсов
true (по умолчанию) | false
Details
Устойчивость полюсов, заданная одним из логических значений:
-
true— все полюса аппроксимации устойчивы; -
false— полюса могут находиться в любой точке комплексной плоскости.
| Типы данных |
|
#
Qlimit —
максимальное значение коэффициента качества
1000 (по умолчанию) | скаляр
Details
Максимальное значение коэффициента качества полюсов аппроксимации, заданное как положительный скаляр.
| Типы данных |
|
#
ColumnReduce —
сокращение данных
true (по умолчанию) | false
Details
Сокращение данных, заданное одним из логических значений:
-
true— функция сокращает данные для обработчика, чтобы сэкономить память и вычислительное время; -
false— экономия памяти и вычислительного времени не активирована.
| Типы данных |
|
#
PoleSharing —
тип распределения полюсов
All (по умолчанию) | Column | Individual
Details
Тип распределения полюсов для S-параметров, заданный одним из следующих значений:
-
All— распределение всех полюсов S-параметров; -
Column— распределение полюсов по столбцам S-параметров; -
Individual— распределение полюсов по отдельным S-параметрам.
| Типы данных |
|
#
Display —
параметры отображения алгоритма аппроксимации
"off" (по умолчанию) | "on" | "plot" | "both"
Details
Параметры отображения алгоритма аппроксимации объекта rational, заданные одним из следующих значений:
-
"off"— отображение отсутствует; -
"on"— информация; -
"plot"— графики процесса интерполяции; -
"both"— вывод и информации, и графиков.
| Типы данных |
|
#
Delay —
задержка частотной характеристики
[0.0;;] (по умолчанию) | матрица
Details
Временная задержка частотной характеристики, заданная как матрица.
| Типы данных |
|
#
DirectTerm —
свободный член в аппроксимации
[0.0;;] (по умолчанию) | матрица
Details
Свободный член в аппроксимации или значение в уравнении, приведенном в описании, заданное как двумерная матрица. Длина этой матрицы должна совпадать с первыми двумя измерениями аргумента data. Если задать этот аргумент, то объект задаст аргумент ErrDB.
Если не задать этот аргумент, объект автоматически установит для него значение в виде двумерной матрицы размером NumPorts на NumPorts.
| Типы данных |
|
#
ErrDB —
ошибка между аппроксимацией и исходными данными
−Inf (по умолчанию) | скаляр
Details
Ошибка между аппроксимацией и исходными данными, заданная как скаляр в дБ.
| Этот аргумент доступен только для чтения. |
| Типы данных |
|
#
NumPoles —
количество полюсов
0 (по умолчанию) | скаляр
Details
Количество полюсов в аппроксимации, заданное как неотрицательное целое число. Если аргумент NumPoles не задан, объект устанавливает его значение автоматически.
Не задавайте входной аргумент tol и аргумент типа «имя-значение» Tolerance при указании количества полюсов аппроксимации с помощью аргумента NumPoles.
|
| Типы данных |
|
#
NumPorts —
количество портов
1 (по умолчанию) | вектор
Details
Количество портов в исходных данных S-параметров, заданное как вектор размером 1 на 2. Значение аргумента NumPorts определяется на основе данных S-параметров.
| Этот аргумент доступен только для чтения. |
| Типы данных |
|
#
Poles —
полюса аппроксимации
[] (по умолчанию) | вектор
Details
Полюса аппроксимации, заданные как вектор-строка размером NumPoles на 1. Если этот аргумент задан, объект задает аргументы Residues, DirectTerm и ErrDB, или можно задать их отдельно.
Если аргумент Poles не задан, объект устанавливает его значение автоматически.
При установке полюсов подгонки с помощью аргумента Poles аргументы NoiseFloor, Causal, ColumnReduce, MaxPoles, NumPoles и Qlimit игнорируются.
|
| Типы данных |
|
#
Residues —
вычеты аппроксимации
массив
Details
Вычеты аппроксимации, заданные как трехмерный массив. Первые два измерения массива Residues должны иметь ту же длину, что и первые два измерения аргумента data, а последнее измерение массива Residues должно иметь ту же длину, что и аргумент Poles. Если этот аргумент задан, объект задает аргументы DirectTerm, ErrDB, или можно задать их отдельно.
Если аргумент Residues не задан, объект автоматически установит для него значение в виде трехмерной матрицы размером NumPorts на NumPorts на NumPoles.
| Типы данных |
|
Выходные аргументы
#
fit —
вычисленная рациональная аппроксимация
объект rational
Details
Вычисленная рациональная аппроксимация комплексных данных, зависимых от частоты, возвращаемая в виде объекта rational.
Примеры
Аппроксимация S-параметров
Details
Рассчитаем S-параметры для объекта схемы example с резистором R50.
using EngeeRF
hR1 = resistor(50, "R50")
hckt1 = circuit("example")
add(hckt1, [1 2], hR1)
setports(hckt1, [1 0], [2 0])
freq = range(1e3, 2e3, length = 10)
S = sparameters(hckt1, freq, 100)
Выполним рациональную аппроксимацию S-параметров и выведем свойства объекта rational.
fit = rational(S)
println("Delay: ", fit.Delay,
"\nDirectTerm: ", fit.DirectTerm,
"\nErrDB: ", fit.ErrDB,
"\nNumPoles: ", fit.NumPoles,
"\nNumPorts: ", fit.NumPorts,
"\nPoles: ", fit.Poles,
"\nResidues: ", fit.Residues)
Delay: [0.0 0.0; 0.0 0.0]
DirectTerm: [0.0 0.0; 0.0 0.0]
ErrDB: -70.0044060037275
NumPoles: 8
NumPorts: 2
Poles: ComplexF64[-19618.734058480502 + 0.0im, -17016.082839453717 + 0.0im, -14758.703305527004 + 0.0im, -12800.791187707133 + 0.0im, -11102.61868127103 + 0.0im, -9629.7283327366 + 0.0im, -8352.233867019033 + 0.0im, -7244.213767924145 + 0.0im]
Residues: ComplexF64[9.824070000137314e6 + 0.0im 3.929628000055413e7 + 0.0im; 3.9296280000553586e7 + 0.0im 9.824070000137314e6 + 0.0im;;; -4.441693985381927e7 + 0.0im -1.7766775941529915e8 + 0.0im; -1.776677594152968e8 + 0.0im -4.441693985381927e7 + 0.0im;;; 8.972096693535988e7 + 0.0im 3.5888386774148345e8 + 0.0im; 3.588838677414788e8 + 0.0im 8.972096693535988e7 + 0.0im;;; -1.0574206264507577e8 + 0.0im -4.229682505803536e8 + 0.0im; -4.229682505803484e8 + 0.0im -1.0574206264507577e8 + 0.0im;;; 7.903143194708505e7 + 0.0im 3.1612572778837645e8 + 0.0im; 3.1612572778837293e8 + 0.0im 7.903143194708505e7 + 0.0im;;; -3.763439152535831e7 + 0.0im -1.5053756610144946e8 + 0.0im; -1.5053756610144803e8 + 0.0im -3.763439152535831e7 + 0.0im;;; 1.059884870604168e7 + 0.0im 4.239539482417094e7 + 0.0im; 4.239539482417063e7 + 0.0im 1.059884870604168e7 + 0.0im;;; -1.3618189431558964e6 + 0.0im -5.447275772624157e6 + 0.0im; -5.447275772624077e6 + 0.0im -1.3618189431558964e6 + 0.0im]
Управление полюсами в объекте rational
Details
Создадим объект S-параметра.
using EngeeRF
hR1 = resistor(50, "R50")
hckt = circuit()
add(hckt, [1 2], hR1)
freq = range(1e3, 2e3, length = 10)
S = sparameters(hckt1, freq, 100)
Выполним рациональную аппроксимацию по умолчанию.
fit = rational(S)
println("Delay: ", fit.Delay,
"\nDirectTerm: ", fit.DirectTerm,
"\nErrDB: ", fit.ErrDB,
"\nNumPoles: ", fit.NumPoles,
"\nNumPorts: ", fit.NumPorts,
"\nPoles: ", fit.Poles,
"\nResidues: ", fit.Residues)
Delay: [0.0 0.0; 0.0 0.0]
DirectTerm: [0.0 0.0; 0.0 0.0]
ErrDB: -70.0044060037275
NumPoles: 8
NumPorts: 2
Poles: ComplexF64[-19618.734058480502 + 0.0im, -17016.082839453717 + 0.0im, -14758.703305527004 + 0.0im, -12800.791187707133 + 0.0im, -11102.61868127103 + 0.0im, -9629.7283327366 + 0.0im, -8352.233867019033 + 0.0im, -7244.213767924145 + 0.0im]
Residues: ComplexF64[9.824070000137314e6 + 0.0im 3.929628000055413e7 + 0.0im; 3.9296280000553586e7 + 0.0im 9.824070000137314e6 + 0.0im;;; -4.441693985381927e7 + 0.0im -1.7766775941529915e8 + 0.0im; -1.776677594152968e8 + 0.0im -4.441693985381927e7 + 0.0im;;; 8.972096693535988e7 + 0.0im 3.5888386774148345e8 + 0.0im; 3.588838677414788e8 + 0.0im 8.972096693535988e7 + 0.0im;;; -1.0574206264507577e8 + 0.0im -4.229682505803536e8 + 0.0im; -4.229682505803484e8 + 0.0im -1.0574206264507577e8 + 0.0im;;; 7.903143194708505e7 + 0.0im 3.1612572778837645e8 + 0.0im; 3.1612572778837293e8 + 0.0im 7.903143194708505e7 + 0.0im;;; -3.763439152535831e7 + 0.0im -1.5053756610144946e8 + 0.0im; -1.5053756610144803e8 + 0.0im -3.763439152535831e7 + 0.0im;;; 1.059884870604168e7 + 0.0im 4.239539482417094e7 + 0.0im; 4.239539482417063e7 + 0.0im 1.059884870604168e7 + 0.0im;;; -1.3618189431558964e6 + 0.0im -5.447275772624157e6 + 0.0im; -5.447275772624077e6 + 0.0im -1.3618189431558964e6 + 0.0im]
Ограничим количество полюсов четырьмя и обратим внимание, что ошибка в fit1 выше, чем ошибка в fit.
fit1 = rational(S, NumPoles = 4)
println("Delay: ", fit1.Delay,
"\nDirectTerm: ", fit1.DirectTerm,
"\nErrDB: ", fit1.ErrDB,
"\nNumPoles: ", fit1.NumPoles,
"\nNumPorts: ", fit1.NumPorts,
"\nPoles: ", fit1.Poles,
"\nResidues: ", fit1.Residues)
Delay: [0.0 0.0; 0.0 0.0]
DirectTerm: [0.0 0.0; 0.0 0.0]
ErrDB: -36.73200528819233
NumPoles: 4
NumPorts: 2
Poles: ComplexF64[-20106.192982974677 + 0.0im, -16421.270078345475 + 0.0im, -11921.505918955323 + 0.0im, -8654.769253390557 + 0.0im]
Residues: ComplexF64[140272.17338248386 + 0.0im 561088.6935299853 + 0.0im; 561088.6935299853 + 0.0im 140272.17338248386 + 0.0im;;; -198002.15639575062 + 0.0im -792008.6255830727 + 0.0im; -792008.6255830729 + 0.0im -198002.15639575062 + 0.0im;;; 86786.17118317388 + 0.0im 347144.6847327263 + 0.0im; 347144.68473272637 + 0.0im 86786.17118317388 + 0.0im;;; -17635.440523174977 + 0.0im -70541.76209270621 + 0.0im; -70541.7620927062 + 0.0im -17635.440523174977 + 0.0im]
Пусть объект rational использует вдвое больше полюсов, чем в fit. Обратим внимание, что ошибка в fit2 ниже, чем в fit.
fit2 = rational(S, NumPoles = 2 * fit.NumPoles)
println("Delay: ", fit2.Delay,
"\nDirectTerm: ", fit2.DirectTerm,
"\nErrDB: ", fit2.ErrDB,
"\nNumPoles: ", fit2.NumPoles,
"\nNumPorts: ", fit2.NumPorts,
"\nPoles: ", fit2.Poles,
"\nResidues: ", fit2.Residues)
Delay: [0.0 0.0; 0.0 0.0]
DirectTerm: [0.0 0.0; 0.0 0.0]
ErrDB: -112.62617734539667
NumPoles: 16
NumPorts: 2
Poles: ComplexF64[-20977.739719155164 + 0.0im, -19455.169375359666 + 0.0im, -18043.107622234136 + 0.0im, -16733.53371468684 + 0.0im, -15519.009055596898 + 0.0im, -14392.634943348294 + 0.0im, -13348.013386059776 + 0.0im, -12379.210759929256 + 0.0im, -11480.724105265892 + 0.0im, -10647.44986876583 + 0.0im, -9874.654914482498 + 0.0im, -9157.949638828946 + 0.0im, -8493.263036901022 + 0.0im, -7876.81957849392 + 0.0im, -7305.117762464063 + 0.0im, -6774.910227621532 + 0.0im]
Residues: ComplexF64[2.6792602830979095e9 + 0.0im 1.0717041132461851e10 + 0.0im; 1.0717041132424355e10 + 0.0im 2.6792602830979095e9 + 0.0im;;; -1.6551610150291655e10 + 0.0im -6.6206440601639626e10 + 0.0im; -6.620644060138717e10 + 0.0im -1.6551610150291655e10 + 0.0im;;; 4.241942317337665e10 + 0.0im 1.6967769269484216e11 + 0.0im; 1.6967769269412943e11 + 0.0im 4.241942317337665e10 + 0.0im;;; -5.353206936770874e10 + 0.0im -2.1412827747274033e11 + 0.0im; -2.1412827747172232e11 + 0.0im -5.353206936770874e10 + 0.0im;;; 2.2527186601576572e10 + 0.0im 9.010874640736554e10 + 0.0im; 9.010874640679639e10 + 0.0im 2.2527186601576572e10 + 0.0im;;; 2.4717002984422768e10 + 0.0im 9.886801193841866e10 + 0.0im; 9.886801193803366e10 + 0.0im 2.4717002984422768e10 + 0.0im;;; -3.178987886029754e10 + 0.0im -1.2715951544254651e11 + 0.0im; -1.271595154418193e11 + 0.0im -3.178987886029754e10 + 0.0im;;; -4.500302431620929e9 + 0.0im -1.8001209726401134e10 + 0.0im; -1.8001209726451694e10 + 0.0im -4.500302431620929e9 + 0.0im;;; 2.9396296730180614e10 + 0.0im 1.1758518692192986e11 + 0.0im; 1.1758518692128374e11 + 0.0im 2.9396296730180614e10 + 0.0im;;; -1.275527724785865e10 + 0.0im -5.102110899221674e10 + 0.0im; -5.102110899179006e10 + 0.0im -1.275527724785865e10 + 0.0im;;; -1.7836577284244797e10 + 0.0im -7.134630913762163e10 + 0.0im; -7.134630913728137e10 + 0.0im -1.7836577284244797e10 + 0.0im;;; 2.861171487692228e10 + 0.0im 1.1444685950908478e11 + 0.0im; 1.1444685950832954e11 + 0.0im 2.861171487692228e10 + 0.0im;;; -1.9466032508811897e10 + 0.0im -7.786413003633995e10 + 0.0im; -7.78641300357427e10 + 0.0im -1.9466032508811897e10 + 0.0im;;; 7.58099891142497e9 + 0.0im 3.0323995646177166e10 + 0.0im; 3.0323995645913757e10 + 0.0im 7.58099891142497e9 + 0.0im;;; -1.6608386451879582e9 + 0.0im -6.643354580868171e9 + 0.0im; -6.643354580803363e9 + 0.0im -1.6608386451879582e9 + 0.0im;;; 1.607357462849066e8 + 0.0im 6.429429851521003e8 + 0.0im; 6.429429851451098e8 + 0.0im 1.607357462849066e8 + 0.0im]
Литература
-
Nakatsukasa, Yuji, Olivier Sète, and Lloyd N. Trefethen. «The AAA Algorithm for Rational Approximation.» SIAM Journal on Scientific Computing 40, no. 3 (January 2018): A1494–1522. https://doi.org/10.1137/16M1106122.