scipy transferfunction vs state space

时间:2017-03-08 19:34:47

标签: scipy system lti

我有一个LTI系统,我使用scipy.signals进行建模。但是当使用TransferFunction或StateSpace时,我会得到不同的结果。 除了波特图和阶跃响应的幅度不同之外,StateSpace表示在我知道不存在的LTI系统上再添加两个零。 我知道一个事实,这两个描述应该是等价的(至少我认为我这样做),因为我做了几次数学运算。 有人可以帮我解释一下发生了什么吗?

传递函数:

from params import *

numeratorthetaact = [Kt*Jl/(L*Jl*Ja), Kt*(betal+betac)/(L*Jl*Ja),    Kt*kc/(L*Jl*Ja)]
denominatorthetaact = [1.0,
                   (L*betac*(Ja+Jl))/(Jl*Ja) + R/L,
                   (Ja+Jl)*(L*kc+R*betac)/(Jl*Ja*L) + (Kt*Kb)/(Ja*L),
                   (R*kc*(Ja+Jl))/(L*Jl*Ja) + (betac*Kt*Kb)/(L*Jl*Ja),
                   (kc*Kt*Kb)/(L*Jl*Ja),
                   0.0]

tfact = TransferFunction(numeratorthetaact, denominatorthetaact)
sysact = lti(tfact.num, tfact.den)

print "Zeros: ", sysact.zeros
print "Poles: ", sysact.poles

t, swact = step(sysact, T = time)
freqrad = numpy.multiply(frequency, 2.0*numpy.pi)
wrad, magact, phaseact = sysact.bode(w=freqrad)

whz = numpy.multiply(wrad, 1.0/(numpy.pi*2.0))

p.subplot(3,1,1)
p.plot(t, swact, label="Step Galvo")
p.legend()
p.subplot(3,1,2)
p.semilogx(whz, magact, label="Freq Galvo")
p.legend()
p.grid()
p.subplot(3,1,3)
p.semilogx(whz, phaseact, label="Phase Galvo")
p.legend()
p.grid()
p.show()

StateSpace的代码

from params import *

matrixA = numpy.array([[-(betaa+betac)/Ja, -kc/Ja, betac/Ja, kc/Ja, Kb/Ja],
                  [1.0, 0, 0, 0, 0],
                  [betac/Jl, kc/Jl, -(betal+betac)/Jl, -kc/Jl, 0],
                  [0, 0, 1.0, 0, 0],
                  [-Kb/L, 0, 0, 0, -R/L]])
matrixB = numpy.array([[0],
                  [0],
                  [0],
                  [0],
                  [1.0/L]])
matrixC = numpy.array([[0, 1.0, 0, 0, 0]])
matrixD = 0.0

ssact = StateSpace(matrixA, matrixB, matrixC, matrixD)
sysact = lti(ssact.A, ssact.B, ssact.C, ssact.D)

print "Zeros: ", sysact.zeros
print "Poles: ", sysact.poles

t, swact = step(sysact, T = time)
freqrad = numpy.multiply(frequency, 2.0*numpy.pi)
wrad, magact, phaseact = sysact.bode(w=freqrad)

whz = numpy.multiply(wrad, 1.0/(numpy.pi*2.0))

p.subplot(3,1,1)
p.plot(t, swact, label="Step Galvo")
p.legend()
p.subplot(3,1,2)
p.semilogx(whz, magact, label="Freq Galvo")
p.legend()
p.grid()
p.subplot(3,1,3)
p.semilogx(whz, phaseact, label="Phase Galvo")
p.legend()
p.grid()
p.show()

结果图:

StateSpace vs TransferFunction

值得一提的是,运行StateSpace代码时出现BadCoefficients: Badly conditioned filter coefficients (numerator): the results may be meaningless "results may be meaningless", BadCoefficients)错误。

谢谢

0 个答案:

没有答案