Моделирование линейной системы с помощью Python - PullRequest
5 голосов
/ 16 ноября 2011

Я хотел бы смоделировать / смоделировать замкнутую, линейную, не зависящую от времени систему (в частности, запираемое приближение ФАПЧ) с помощью Python.

Каждый субблок в модели имеет известную передаточную функцию, которая задается в терминах комплексной частоты H(s) = K / ( s * tau + 1 ).Используя эту модель, я хотел бы увидеть, как изменяется отклик системы, а также отклик на шум при изменении параметров (например, усиления VCO).Это будет включать использование графиков Боде и корневых локусов.

Какие модули Python я должен искать, чтобы выполнить работу?

Ответы [ 5 ]

12 голосов
/ 13 января 2012

Я знаю, что это немного устарело, но поиск привел меня к этому вопросу.Я собрал это, когда не смог найти хороший модуль для него.Это немного, но это хорошее начало, если кто-то еще окажется здесь.

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)

Редактировать: Я вернулся сюда, потому что кто-то проголосовал за этот ответ, вы должны попробовать Библиотека систем управления .Они реализовали большую часть инструментария систем управления Matlab с соответствующим синтаксисом и всем прочим.

4 голосов
/ 20 августа 2013

Согласно 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 голосов
/ 30 ноября 2014

Я получил графики Боде, работающие таким образом, с использованием python-control.

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

3 голосов
/ 23 апреля 2013

Как сказал @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]).

0 голосов
/ 16 ноября 2011

scipy и numpy модули подходят для вашего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...