2011-11-15 23 views
5

Me gustaría simular/modelar un sistema de bucle cerrado, lineal e invariante en el tiempo (específicamente una aproximación PLL bloqueada) con python.Modelado de un sistema lineal con Python

Cada subbloque dentro del modelo tiene una función de transferencia conocida que se da en términos de frecuencia compleja H(s) = K/(s * tau + 1). Utilizando el modelo, me gustaría ver cómo se modifican la respuesta del sistema y la respuesta al ruido a medida que cambian los parámetros (por ejemplo, la ganancia de VCO). Esto implicaría el uso de diagramas de Bode y parcelas de raíces y locus.

¿Qué módulos de Python debo buscar para hacer el trabajo?

+0

Ingeniería Eléctrica es para preguntas sobre el diseño e implementación de sistemas lineales, no por su simulación y modelado; ese es un tema para Stack Overflow. –

+1

Lamentablemente, MathJax/LaTeX no está disponible en Stack Overflow; Gracias por usarlo aquí, pero lo estoy editando para la migración. –

+0

Si bien no creo que (ni ningún módulo de Python) contenga tramas "enlazadas" de Bode o raíz-locus, debería ser capaz de generar sus propios gráficos bidimensionales adecuados usando [matplotlib] (http: //matplotlib.sourceforge .net /) con Python. – mctylr

Respuesta

12

Sé que esto es un poco viejo, pero una búsqueda me llevó a esta pregunta. Junté esto cuando no pude encontrar un buen módulo para él. No es mucho, pero es un buen comienzo si alguien más se encuentra aquí.

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) 

Editar: Estoy aquí porque alguien upvoted esta respuesta, usted debe tratar Control Systems Library. Han implementado la mayor parte de la caja de herramientas de sistemas de control Matlab con sintaxis coincidente y todo.

+0

Acepté esta respuesta después de la edición sobre la Biblioteca de sistemas de control. – benpro

-1

scipy y numpy módulos son adecuados para su aplicación.

+1

Sé y uso scipy y numpy, pero seguramente hay algo más específico y específico para el modelado de sistemas lineales. Puede ser un submódulo de numpy/scipy ??? – benpro

3

Como @Matt dijo, sé que esto es viejo. Pero este fue mi primer hit de Google, así que quise editarlo.

Puede usar scipy.signal.lti para modelar sistemas lineales invariantes en el tiempo. Eso te da lti.bode. Para una respuesta de impulso en forma de H (s) = (As^2 + Bs + C)/(Ds^2 + Es + F), debe ingresar h = scipy.signal.lti([A,B,C],[D,E,F]). Para obtener el diagrama de Bode, haría plot(*h.bode()[:2]).

3

que tiene diagramas de Bode de trabajo de esta manera, el uso de 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(); 

El código fue tomada principalmente de este ejemplo que es muy extensa

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

Cuestiones relacionadas