Документация Engee

rational

Выполняет рациональную аппроксимацию комплексных данных, зависящих от частоты.

Библиотека

EngeeRF

Описание

Используйте функцию rational для выполнения рациональной аппроксимации комплексных данных, зависящих от частоты. Данная функция использует алгоритм AAA [1] для построения рациональной аппроксимации с комплексными частотами . Алгоритм AAA использует барицентрическую форму для решения проблем масштабирования, с которыми сталкиваются другие методы рациональной аппроксимации, в частности, широко используемый алгоритм векторной аппроксимации. Это позволяет алгоритму AAA быстро сходиться к почти оптимальной рациональной функции аппроксимации. Аппроксимация каждого элемента функции rational задается следующим уравнением:

где

  • — вычеты;

  • — полюса;

  • — свободный член.

Синтаксис

Вызов функции

  • fit = rational() — создает неотражающий однопортовый объект rational, свойства которого заданы по умолчанию.

  • fit = rational(freq,data) — выполняет рациональную аппроксимацию для заданного вектора частот freq и данных параметров сети data.

  • fit = rational(s) — выполняет рациональную аппроксимацию для N-портового объекта S-параметров s.

  • fit = rational(filename) — выполняет рациональную аппроксимацию данных сети из файла, указанного в аргументе filename.

  • fit = rational(___,tol) — выполняет рациональную аппроксимацию, стремясь удовлетворить заданной относительной погрешности tol.

  • fit = rational(___,Name=Value) — задает параметры для управления аспектами аппроксимации или устанавливает свойства объекта rational с помощью аргументов типа «имя-значение».

Аргументы

Входные аргументы

# freq — неотрицательные частоты
вектор

Details

Неотрицательные частоты в Гц, заданные как вектор.

Типы данных

Float64

# data — данные параметров сети
вектор | массив

Details

Данные параметров сети, заданные как вектор, двумерный или трехмерный массив. Длина значений данных должна быть равна длине значений частоты freq.

# s — N-портовые S-параметры
объект sparameters

Details

N-портовые S-параметры, заданные как объект sparameters.

# filename — имя файла сетевых данных
строка

Details

Имя файла сетевых данных, заданное как строка. Файл данных должен иметь расширение .snp (файл Touchstone).

# tol — допустимая относительная погрешность
−40 (по умолчанию) | скаляр

Details

Допустимая относительная погрешность, заданная как скаляр, меньший или равный 0 дБ.

Не задавайте входной аргумент tol и аргумент типа «имя-значение» Tolerance при указании количества полюсов аппроксимации с помощью аргумента NumPoles.

Входные аргументы «имя-значение»

Укажите необязательные пары аргументов в виде Name=Value, где Name — имя аргумента, а Value — соответствующее значение. Аргументы типа «имя-значение» должны располагаться после других аргументов, но порядок пар не имеет значения.

Пример: fit = rational(s, MaxPoles = 1002) устанавливает максимальное количество полюсов для аппроксимации. Можно указать несколько пар «имя-значение».

# Tolerance — допустимая относительная погрешность
−40 (по умолчанию) | скаляр

Details

Допустимая относительная погрешность, заданная как скаляр, меньший или равный 0 дБ.

Не задавайте входной аргумент tol и аргумент типа «имя-значение» Tolerance при указании количества полюсов аппроксимации с помощью аргумента NumPoles.
Типы данных

Float64

# TendsToZero — поведение аппроксимации при больших значениях S-параметров
true (по умолчанию) | false

Details

Поведение аппроксимации при больших S-параметров, заданное одним из логических значений:

  • true — свободный член в аппроксимации обнуляется, так что рациональная аппроксимация стремится к нулю по мере приближения к бесконечности;

  • false — допускается ненулевой свободный член.

Типы данных

Bool

# MaxPoles — максимальное количество полюсов
1000 (по умолчанию) | скаляр

Details

Максимальное количество полюсов, заданное как неотрицательное целое число.

Типы данных

Int64

# ErrorMetric — метрика ошибок в объекте rational
"default" (по умолчанию) | "Relative"

Details

Метрика ошибок в объекте rational, заданная одним из следующих способов:

  • "default" — объект rational будет равномерно распределять ошибку;

  • "Relative" — объект rational будет соответствовать как пикам, так и впадинам, или получать меньшую ошибку для меньших значений.

Типы данных

Symbol

# NoiseFloor — игнорирование низкоуровневого шума в данных
−Inf (по умолчанию) | скаляр

Details

Аргумент, позволяющий игнорировать низкоуровневый шум в данных, заданный как скаляр.

Типы данных

Float64

# Causal — устойчивость полюсов
true (по умолчанию) | false

Details

Устойчивость полюсов, заданная одним из логических значений:

  • true — все полюса аппроксимации устойчивы;

  • false — полюса могут находиться в любой точке комплексной плоскости.

Типы данных

Bool

# Qlimit — максимальное значение коэффициента качества
1000 (по умолчанию) | скаляр

Details

Максимальное значение коэффициента качества полюсов аппроксимации, заданное как положительный скаляр.

Типы данных

Float64

# ColumnReduce — сокращение данных
true (по умолчанию) | false

Details

Сокращение данных, заданное одним из логических значений:

  • true — функция сокращает данные для обработчика, чтобы сэкономить память и вычислительное время;

  • false — экономия памяти и вычислительного времени не активирована.

Типы данных

Bool

# PoleSharing — тип распределения полюсов
All (по умолчанию) | Column | Individual

Details

Тип распределения полюсов для S-параметров, заданный одним из следующих значений:

  • All — распределение всех полюсов S-параметров;

  • Column — распределение полюсов по столбцам S-параметров;

  • Individual — распределение полюсов по отдельным S-параметрам.

Типы данных

Symbol, String

# Display — параметры отображения алгоритма аппроксимации
"off" (по умолчанию) | "on" | "plot" | "both"

Details

Параметры отображения алгоритма аппроксимации объекта rational, заданные одним из следующих значений:

  • "off" — отображение отсутствует;

  • "on" — информация;

  • "plot" — графики процесса интерполяции;

  • "both" — вывод и информации, и графиков.

Типы данных

Symbol


# Delay — задержка частотной характеристики
[0.0;;] (по умолчанию) | матрица

Details

Временная задержка частотной характеристики, заданная как матрица.

Типы данных

Float64

# DirectTerm — свободный член в аппроксимации
[0.0;;] (по умолчанию) | матрица

Details

Свободный член в аппроксимации или значение в уравнении, приведенном в описании, заданное как двумерная матрица. Длина этой матрицы должна совпадать с первыми двумя измерениями аргумента data. Если задать этот аргумент, то объект задаст аргумент ErrDB.

Этот аргумент необходимо задавать наряду с аргументами Poles и Residues.

Если не задать этот аргумент, объект автоматически установит для него значение в виде двумерной матрицы размером NumPorts на NumPorts.

Типы данных

Float64

# ErrDB — ошибка между аппроксимацией и исходными данными
−Inf (по умолчанию) | скаляр

Details

Ошибка между аппроксимацией и исходными данными, заданная как скаляр в дБ.

Этот аргумент доступен только для чтения.
Типы данных

Float64

# NumPoles — количество полюсов
0 (по умолчанию) | скаляр

Details

Количество полюсов в аппроксимации, заданное как неотрицательное целое число. Если аргумент NumPoles не задан, объект устанавливает его значение автоматически.

Не задавайте входной аргумент tol и аргумент типа «имя-значение» Tolerance при указании количества полюсов аппроксимации с помощью аргумента NumPoles.
Типы данных

Int64

# NumPorts — количество портов
1 (по умолчанию) | вектор

Details

Количество портов в исходных данных S-параметров, заданное как вектор размером 1 на 2. Значение аргумента NumPorts определяется на основе данных S-параметров.

Этот аргумент доступен только для чтения.
Типы данных

Int64

# Poles — полюса аппроксимации
[] (по умолчанию) | вектор

Details

Полюса аппроксимации, заданные как вектор-строка размером NumPoles на 1. Если этот аргумент задан, объект задает аргументы Residues, DirectTerm и ErrDB, или можно задать их отдельно.

Если аргумент Poles не задан, объект устанавливает его значение автоматически.

При установке полюсов подгонки с помощью аргумента Poles аргументы NoiseFloor, Causal, ColumnReduce, MaxPoles, NumPoles и Qlimit игнорируются.
Типы данных

ComplexF64

# Residues — вычеты аппроксимации
массив

Details

Вычеты аппроксимации, заданные как трехмерный массив. Первые два измерения массива Residues должны иметь ту же длину, что и первые два измерения аргумента data, а последнее измерение массива Residues должно иметь ту же длину, что и аргумент Poles. Если этот аргумент задан, объект задает аргументы DirectTerm, ErrDB, или можно задать их отдельно.

Если аргумент Residues не задан, объект автоматически установит для него значение в виде трехмерной матрицы размером NumPorts на NumPorts на NumPoles.

Типы данных

ComplexF64

Выходные аргументы

# 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]

Литература

  1. 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.