2011-11-15 208 views
5

我想用python來模擬/模擬一個閉環,線性,時間不變的系統(特別是鎖定的PLL逼近)。用Python建模一個線性系統

模型中的每個子塊都有一個已知的傳遞函數,該函數根據複合頻率H(s) = K/(s * tau + 1)給出。使用該模型,我希望看到系統響應以及噪聲響應如何隨着參數(例如VCO增益)的改變而受到影響。這將涉及使用波德圖和根軌跡圖。

我應該尋求哪些Python模塊來完成工作?

+0

電氣工程是關於設計和實現線性系統,而不是爲他們的模擬和建模的問題;這是Stack Overflow的主題。 –

+1

遺憾的是,MathJax/LaTeX在Stack Overflow上不可用;感謝您在這裏使用它,但我正在編輯它進行遷移。 –

+0

雖然我不相信它(或任何Python模塊)包含「罐裝」Bode或根軌跡圖,但您應該可以使用[matplotlib](http://matplotlib.sourceforge)生成您自己的合適二維圖.net /)與Python。 – mctylr

回答

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) 

編輯:我回到這裏,是因爲有人upvoted這個答案,你應該嘗試Control Systems Library。他們已經使用匹配的語法和一切來實現大部分Matlab控制系統工具箱。

+0

我在編輯控制系統庫後接受了這個答案。 – benpro

-1

scipynumpy模塊適合您的應用。

+1

我知道並使用scipy和numpy,但肯定有一些更具體和針對性的線性系統建模。它可能是numpy/scipy的子模塊? – benpro

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

我波特圖工作了這種方式,使用python-控制。

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