residuez
Разложение Z-преобразования на простые дроби.
| Библиотека |
|
Аргументы
Входные аргументы
#
bi,ai —
коэффициенты полинома
векторы
Details
Коэффициенты полинома, заданные как векторы. Векторы b и a задают коэффициенты полиномов дискретных систем по возрастанию степеней :
Если корней несколько и , то
#
ri —
вычеты разложения на простые дроби
вектор-столбец
Details
Вычеты разложения на простые дроби, заданные как вектор.
#
pi —
полюса разложения на простые дроби
вектор-столбец
Details
Полюса разложения на простые дроби, заданные как вектор.
#
ki —
многочлен целой части разложения
вектор-строка
Details
Многочлен целой части разложения, заданный как вектор.
Выходные аргументы
#
ro —
вычеты разложения на простые дроби
вектор-столбец
Details
Вычеты разложения на простые дроби, возвращаемые в виде вектора.
#
po —
полюса разложения на простые дроби
вектор-столбец
Details
Полюса разложения на простые дроби, возвращаемые в виде вектора.
Количество полюсов определяется как
Если является полюсом кратности , то разложение включает члены вида
#
ko —
многочлен целой части разложения
вектор-строка
Details
Многочлен целой части разложения, возвращаемый в виде вектора.
Вектор коэффициентов многочлена целой части пуст, если меньше ; в противном случае:
#
bo,ao —
коэффициенты полинома
векторы
Details
Коэффициенты полинома, возвращаемые в виде векторов.
Примеры
Разложение на простые дроби БИХ-фильтра нижних частот
Details
Вычислим разложение на простые дроби, соответствующее БИХ-фильтру нижних частот третьего порядка, описываемому передаточной функцией
Выразим числитель и знаменатель в виде полиномиальных сверток.
import EngeeDSP.Functions: conv, residuez
b0 = 0.05634
b1 = [1, 1]
b2 = [1, -1.0166, 1]
a1 = [1, -0.683]
a2 = [1, -1.4461, 0.7957]
b = b0*conv(b1,b2)
a = conv(a1,a2)
Вычислим вычеты, полюса и многочлен целой части разложения на простые дроби.
r,p,k = residuez(b,a)
print("r: ")
show(stdout, "text/plain", r)
println()
print("p: ")
show(stdout, "text/plain", p)
println()
print("k: ")
show(stdout, "text/plain", k)
r: 3×1 Matrix{ComplexF64}:
-0.1152524739870425 - 0.018151109860882933im
-0.1152524739870425 + 0.018151109860882933im
0.39051343991033616 + 0.0im
p: 3×1 Matrix{ComplexF64}:
0.7230499999999996 + 0.522397068808775im
0.7230499999999996 - 0.522397068808775im
0.6829999999999996 - 0.0im
k: -0.10366849193625106
Построим график полюсов и нулей передаточной функции и наложим на него найденные полюса.
zeros = roots(vec(b))
poles = roots(vec(a))
θ = range(0, 2π, length=100)
unit_circle = exp.(1im * θ)
plot(real(unit_circle), imag(unit_circle),
linecolor=:black,
linestyle=:dash,
label="Unit Circle",
aspect_ratio=:equal,
xlims=(-1.2, 1.2),
ylims=(-1.2, 1.2))
scatter!(real(zeros), imag(zeros),
marker=:circle,
markersize=8,
color=:blue,
label="b")
scatter!(real(poles), imag(poles),
marker=:circle,
markersize=8,
color=:red,
label="a")
scatter!(real(p), imag(p),
marker=:x,
markersize=5,
color=:green,
label="poles")

Используем residuez снова, чтобы восстановить передаточную функцию.
bn,an = residuez(r,p,k)
print("bn: ")
show(stdout, "text/plain", bn)
println()
print("an: ")
show(stdout, "text/plain", an)
bn: 1×4 Matrix{Float64}:
0.05634 -0.000935244 -0.000935244 0.05634
an: 1×4 Matrix{Float64}:
1.0 -2.1291 1.78339 -0.543463
Алгоритмы
Функция residuez преобразует дискретную систему, выраженную в виде отношения двух полиномов, в разложение на простые дроби. Она также преобразует разложение на простые дроби обратно в исходные коэффициенты полинома.
| С численной точки зрения разложение отношения полиномов на простые дроби является некорректно поставленной задачей. Если полином в знаменателе близок к многочлену с несколькими корнями, то небольшие изменения в данных, включая ошибки округления, могут привести к произвольно большим изменениям в результирующих полюсах и вычетах. Вместо этого следует использовать представления в пространстве состояний или представления с полюсами и нулями. |
Функция residuez применяет стандартные функции Engee и методы простейших дробей для нахождения r, p и k из b и a. Она находит:
-
Многочлен целой части разложения
aс помощьюdeconv(полиномиальное деление), когдаlength(b) > length(a) − 1. -
Полюса с помощью
p = roots(a). -
Любые кратные полюса, переставляя полюса в соответствии с их кратностью.
-
Вычет для каждого простого полюса путем умножения на и вычисления результирующей рациональной функции при .
-
Вычеты для кратных полюсов путем решения
для с помощью операции
\. Здесь — импульсная характеристика редуцированного , — матрица, столбцы которой представляют собой импульсные характеристики систем первого порядка, состоящих из простых корней, а — столбец, содержащий вычеты для простых корней. Каждый столбец матрицы представляет собой импульсную характеристику. Для каждого корня кратности матрица содержит столбцов, представляющих собой импульсные характеристики каждой из следующих систем:Вектор и матрицы и имеют строк, где — общее число корней, а внутренний параметр , по умолчанию равный
1, определяет степень переопределенности системы уравнений.