使用Python建模线性系统

时间:2011-11-15 22:17:09

标签: simulation python modeling

我想用python模拟/建模闭环,线性,时不变系统(特别是锁定的PLL近似)。

模型中的每个子块都具有已知的传递函数,该函数以复频率H(s) = K / ( s * tau + 1 )给出。使用该模型,我想看看随着参数(例如VCO增益)的变化,系统响应以及噪声响应如何受到影响。这将涉及使用Bode图和根轨迹图。

我应该寻求哪些Python模块才能完成工作?

5 个答案:

答案 0 :(得分:12)

我知道这有点老了,但搜索让我想到了这个问题。当我找不到一个好的模块时,我把它放在一起。它并不多,但如果有人发现自己,这是一个良好的开端。

import matplotlib.pylab as plt
import numpy as np
import scipy.signal

def bode(G,f=np.arange(.01,100,.01)):
    plt.figure()
    jw = 2*np.pi*f*1j
    y = np.polyval(G.num, jw) / np.polyval(G.den, jw)
    mag = 20.0*np.log10(abs(y))
    phase = np.arctan2(y.imag, y.real)*180.0/np.pi % 360

    plt.subplot(211)
    #plt.semilogx(jw.imag, mag)
    plt.semilogx(f,mag)
    plt.grid()
    plt.gca().xaxis.grid(True, which='minor')

    plt.ylabel(r'Magnitude (db)')

    plt.subplot(212)
    #plt.semilogx(jw.imag, phase)
    plt.semilogx(f,phase)
    plt.grid()
    plt.gca().xaxis.grid(True, which='minor')
    plt.ylabel(r'Phase (deg)')
    plt.yticks(np.arange(0, phase.min()-30, -30))

    return mag, phase

f=scipy.signal.lti([1],[1,1])
bode(f)

编辑:我回到这里是因为有人赞成这个答案,你应该试试Control Systems Library。他们已经实现了大量的Matlab控制系统工具箱,具有匹配的语法和所有内容。

答案 1 :(得分:4)

根据http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.bode.html 你现在可以用这个:

from scipy import signal
import matplotlib.pyplot as plt

s1 = signal.lti([1], [1, 1])
w, mag, phase = signal.bode(s1)

plt.figure()
plt.semilogx(w, mag)    # bode magnitude plot
plt.figure()
plt.semilogx(w, phase)  # bode phase plot
plt.show()

答案 2 :(得分:3)

正如@Matt所说,我知道这已经过时了。但是这出现了我的第一个谷歌热门,所以我想编辑它。

您可以使用scipy.signal.lti为线性时间不变系统建模。这会给你lti.bode

对于H(s)=(As ^ 2 + Bs + C)/(Ds ^ 2 + Es + F)形式的脉冲响应,您将输入h = scipy.signal.lti([A,B,C],[D,E,F])。要获得波特图,您可以plot(*h.bode()[:2])

答案 3 :(得分:3)

我使用python-control以这种方式运行Bode图。

from matplotlib.pyplot import * # Grab MATLAB plotting functions
from control.matlab import *    # MATLAB-like functions


# Transfer functions for dynamics
G_modele = tf([1], [13500, 345, 1]);

# Use state space versions
G_modele = tf2ss(G_modele);

figure(1); 
bode(G_modele, dB=1);
show();

代码主要来自这个非常广泛的例子

http://www.cds.caltech.edu/~murray/wiki/index.php/Python-control/Example:_Vertical_takeoff_and_landing_aircraft

答案 4 :(得分:-2)

scipynumpy模块适合您的应用。