Einstieg in die Regelungstechnik mit Python

Fachbuch von Hans-Werner Philippsen

Kapitel 3

Die Beispielprogramme des Kapitels 3 behandeln die Berechnung von dynamischen Systemen mit Python.


web301

Lösen einer DGL mit Python

Listing 3.1: Die Lösung einer linearen oder nicht linearen Differenzielgleichung ist mit dem SciPy-Paket möglich.

# -*- coding: utf-8 -*-
"""
Lösung einer linearen DGL
Created on 6.9. 2018

@author: philippsen
"""
# P-T1 

from scipy.integrate import odeint
import numpy as np
import matplotlib.pyplot as plt

def deriv(xa, t, xe):
    a0 = 0.7
    b0 = 0.2
    xapunkt = -a0*xa + b0*xe
    return xapunkt

time = np.arange(0.0, 10.0, 0.01)
xaAnfang = 0
u = 1.0
xa = odeint(deriv, xaAnfang, time, args=(u,))
plt.figure()
plt.plot(time,xa[:,0] ) # 

plt.title('Lösung DGL mit Python P-T1')
plt.grid()

web302

Beispiel 3.4

Listing 3.2: Im Beispiel 3.4 wird die Berechnung des Bode-Diagramms, der Orstkurve und der Sprungantwort eines Regelkreises behandelt.

# -*- coding: utf-8 -*-
"""

Standardregelstrecke mit PI-Regler Beispiel 3.4

Created on 21.3. 2019, modifiziert für Version 0.10.1 am 19.8.24
@author: philippsen
"""

import numpy as np
import control as ct
import matplotlib.pyplot as plt

a0 = 1.; a1 = 10. ; a2 = 31. ; a3 = 30.
b0 = 1.
num  = np.array([b0])
den  = np.array([a3, a2, a1, a0])

strecke = ct.tf(num,den)
#regler = tf([5, 1],[5, 0]) # PI-Regler
regler = ct.tf([5],[1])
G0 = regler*strecke  # Reihenschaltung R(s) und G(s)
print('G0 =',G0.name)
ct.bode_plot(G0,title='Bode-Plot',label=['G0'])

gm, pm, wg, wp = ct.margin(G0)
gmdb = 20*np.log10(gm); wphz = wp/(2*np.pi)
print('Amplitudenreserve = ',gm,' in dB = ',gmdb)
print('Phasenreserve = ',pm)
print('Durchtrittsfrequenz = ',wp,' in Hertz = ',wphz)

Gw = ct.feedback(G0, 1) 
ct.bode_plot(Gw,title='Bode-Plot',label=['Gw'])
plt.figure()
t, y = ct.step_response(Gw)
plt.plot(t,y)
plt.title('Regelkreis Sprungantwort')
plt.xlabel('t [s]'); plt.ylabel('h(t)')
plt.grid()
plt.show()
plt.figure()
ct.nyquist_plot(G0,title='Ortskurve G0') 
plt.figure()
# oder mit Matplotlib direkt
res = ct.nyquist_response(G0) 
plt.plot(res.response.real,res.response.imag)
plt.title('Ortskurve G0 mit Matplotlib')
plt.xlabel('Real'); plt.ylabel('Imag')
plt.grid(True)

Theme von Anders Norén