Как создать на Python модель с нулевым коэффициентом усиления?
Я пытаюсь отобразить в python передаточную функцию в виде выражения ZPK, как это делает Matlab.
Пример:
s=tf('s');
G1=0.5*s;
G2=1/(0.1*s);
G3=1/(s+1);
G4=0.5/(0.5*s+1);
K=0.2;
H1=2.3;
Ga=G1+G2+1;
Gb=K*Ga*G3*G4;
M1=feedback(Gb,H1);
M1=minreal(M1);
display(M1);
M1=zpk(M1);
display(M1);
Что в Matlab дает такой результат:
Transfer function:
0.1 s^2 + 0.2 s + 2
-----------------------------
s^3 + 3.23 s^2 + 2.46 s + 4.6
Zero/pole/gain:
0.1 (s^2 + 2s + 20)
---------------------------------
(s+2.927) (s^2 + 0.3035s + 1.572)
В Python эквивалент таков:
import control as ct
import control.matlab as ml
import numpy as np
def zpk(sys):
b, a = ct.tfdata(sys)
b = np.array(b).flatten()
a = np.array(a).flatten()
z,p,k = ml.tf2zpk(b,a)
sym.pprint(z.round(2))
sym.pprint(p.round(2))
sym.pprint(k.round(2))
s = ct.tf('s')
G1 = 0.5*s
G2 = 1/(0.1*s)
G3 = 1/(s+1)
G4 = 0.5/(0.5*s+1)
K = 0.2
H1 = 2.3
Ga = G1+G2+1
Gb = K*Ga*G3*G4
M1 = ct.feedback(Gb,H1)
M1 = ct.minreal(M1)
sym.pprint(M1)
print()
zpk(M1)
И результат такой:
0 states have been removed from the model
0.1 s^2 + 0.2 s + 2
-----------------------------
s^3 + 3.23 s^2 + 2.46 s + 4.6
[-1.+4.36j -1.-4.36j]
[-2.93+0.j -0.15+1.24j -0.15-1.24j]
0.1
Теперь мне просто нужно было использовать Sympy.Poly
отображать его так, как я хочу, и это выглядело бы чертовски ужасно, но я считаю, что должен быть лучший и более чистый способ сделать это. Пожалуйста, я был бы признателен, если бы кто-нибудь, кто знает, мог бы сказать мне, как это сделать, или библиотеку, которую я могу изучить, которая делает это. Также я хотел бы получить каждый совет о том, как улучшить мое кодирование или его форму, поскольку я новичок в Python. Заранее спасибо!
Мой вид обходного пути к этому:
Пока у меня есть это:
from scipy import *
from scipy import signal
import control as ct
import numpy as np
def zpk(sys):
dataM = ct.tfdata(sys)
num = dataM[0][0][0]
den = dataM[1][0][0]
z,p,k = signal.tf2zpk(num,den)
return z,p,k
def printzpkpoly(sys):
z,p,k = zpk(sys)
print('Numerator')
num = grouproots(z)
print('Denominator')
den = grouproots(p)
print('Gain')
print(k)
def grouproots(vr):
n = len(vr)
i = 0
while i<n:
r = vr[i]
if np.iscomplex(r):
r1 = vr[i+1]
a = np.real(r)
b = np.imag(r)
c1 = -2*a
c0 = (a**2+b**2)
p = [1, c1, c0]
i = i+1
else:
p = [1, -r]
print(p)
i = i+1
return
Это дает такой результат:
Numerator
[1, 2.000000000000001, 19.999999999999996]
Denominator
[1, (2.9265114707993796-0j)]
[1, 0.3034885292006187, 1.5718373380383521]
Gain
0.10000000000000002