Как создать модель с нулевым полюсом в Python? - PullRequest
0 голосов
/ 19 марта 2020

Я пытаюсь отобразить в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...