2011-11-15 59 views
5

Tôi muốn mô phỏng/mô hình hóa một hệ thống vòng lặp, tuyến tính, bất biến thời gian (cụ thể là một xấp xỉ PLL đã khóa) với python.Lập mô hình hệ thống tuyến tính bằng Python

Mỗi khối phụ trong mô hình có chức năng truyền đã biết được đưa ra dưới dạng tần số phức tạp H(s) = K/(s * tau + 1). Sử dụng mô hình, tôi muốn xem cách phản ứng của hệ thống cũng như phản hồi tiếng ồn bị ảnh hưởng như các tham số (ví dụ: tăng VCO) được thay đổi. Điều này sẽ liên quan đến việc sử dụng các ô Bode và các ô mẫu gốc.

Tôi nên tìm kiếm những mô-đun Python nào để hoàn thành công việc?

+0

Kỹ thuật điện là dành cho những câu hỏi về thiết kế và triển khai các hệ thống tuyến tính, không cho mô phỏng và mô hình hóa của họ; đó là một chủ đề cho Stack Overflow. –

+1

Đáng tiếc, MathJax/LaTeX không có sẵn trên Stack Overflow; cảm ơn vì đã sử dụng nó ở đây nhưng tôi đang chỉnh sửa nó để di chuyển. –

+0

Mặc dù tôi không tin rằng (hoặc bất kỳ mô-đun Python nào) có các ô Bode hoặc gốc-locus được đóng hộp, bạn có thể tạo các ô 2-D phù hợp của mình bằng cách sử dụng [matplotlib] (http: //matplotlib.sourceforge) .net /) bằng Python. – mctylr

Trả lời

12

Tôi biết điều này hơi cũ nhưng tìm kiếm đã đưa tôi đến câu hỏi này. Tôi đặt nó lại với nhau khi tôi không thể tìm thấy một mô-đun tốt cho nó. Nó không nhiều, nhưng đó là một khởi đầu tốt nếu ai đó thấy mình ở đây.

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) 

Chỉnh sửa: Tôi quay lại đây vì ai đó đã bình chọn câu trả lời này, bạn nên thử Control Systems Library. Họ đã triển khai phần lớn hộp công cụ hệ thống kiểm soát Matlab với cú pháp phù hợp và mọi thứ.

+0

Tôi chấp nhận câu trả lời này sau khi chỉnh sửa về Thư viện Hệ thống Kiểm soát. – benpro

-1

scipynumpy mô-đun phù hợp cho ứng dụng của bạn.

+1

Tôi biết và sử dụng scipy và gumpy, nhưng chắc chắn có cái gì đó cụ thể hơn và được nhắm mục tiêu cho mô hình hệ thống tuyến tính. Nó có thể là một mô-đun phụ của numpy/scipy ??? – benpro

3

Như @Matt đã nói, tôi biết điều này là cũ. Nhưng điều này đã trở thành hit google đầu tiên của tôi, vì vậy tôi muốn chỉnh sửa nó.

Bạn có thể sử dụng scipy.signal.lti để lập mô hình tuyến tính, các hệ thống bất biến thời gian. Điều đó cung cấp cho bạn lti.bode.

Để có phản hồi xung theo dạng H (s) = (Như^2 + Bs + C)/(Ds^2 + Es + F), bạn sẽ nhập h = scipy.signal.lti([A,B,C],[D,E,F]). Để có được âm mưu lô, bạn sẽ làm plot(*h.bode()[:2]).

3

Tôi có lô Bode làm việc theo cách này, sử dụng python-kiểm soát.

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

Mã này đã được chủ yếu lấy từ ví dụ này là rất phong phú

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

Các vấn đề liên quan