2011-11-15 15 views
5

私は、閉ループの線形時間的不変システム(具体的にはロックされたPLL近似)を、Pythonでシミュレート/モデル化したいと考えています。Pythonで線形システムをモデル化する

モデル内の各サブブロックは、複素周波数H(s) = K/(s * tau + 1)に関して与えられる既知の伝達関数を持っています。モデルを使用して、パラメータ(例えば、VCOゲイン)が変更されると、システム応答とノイズ応答がどのように影響を受けるかを見たいと思います。これには、ボード線図と根軌跡図を使用する必要があります。

私は仕事をするためにどのようなPythonモジュールを探すべきですか?

+0

電気工学ではなく、そのシミュレーションとモデリングのために、線形システムの設計と実装についての質問です非常に広範である。この例から取りました。これはStack Overflowのトピックです。 –

+1

残念ながら、Stack OverflowではMathJax/LaTeXを使用できません。ここでそれを使用していただきありがとうございますが、移行用に編集しています。 –

+0

私はそれ(または任意のPythonモジュール)が "canned" Bodeまたはルート軌跡プロットを含んでいるとは思わないが、[matplotlib](http://matplotlib.sourceforge)を使用して適切な2次元プロットを生成できるはずです.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

scipyおよびnumpyのモジュールがアプリケーションに適しています。

+1

私はscipyとnumpyを知っていますが、確かに、より具体的で線形システムモデリングの対象があります。それはnumpy/scipyのサブモジュールかもしれない??? – benpro

3

@Mattが言ったように、私はこれが古いことを知っています。しかし、これは私の最初のGoogleのヒットのようになったので、私はそれを編集したい。

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])を実行します。

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() 
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

関連する問題