Einstieg in die Regelungstechnik mit Python

Fachbuch von Hans-Werner Philippsen

Kapitel 6

Auf dieser Seite finden sich Python-Programme, die Berechnungen zur Stabilität durchführen und Entwurfsverfahren zeigen.


web601

Stabilität

Listing 6.1: Berechnet werden die Pole und Nullstellen eines Systems und ein Pol-Nullstellen-Plan wird geplottet.

# -*- coding: utf-8 -*-
"""
Stabilitätsanalyse: Berechnung der Pole bzw. Plot
der Pole und Nullstellen

Created on 17.4. 2019
@author: philippsen
"""

import numpy as np
#import control
import control.matlab as ma
import matplotlib.pyplot as plt

num = np.array([1,0.4, 1])
den  = np.array([1,2, 1, 4])
print(den)
print("Pole = ", str(np.roots(den)) )

sys = ma.tf(num,den)
print(sys)
print("Pole = ", ma.pole(sys) )
print("Nullstellen = ", ma.zero(sys) )
ma.pzmap(sys)
plt.grid()

web602

Wurzelortskurve

Listing 6.2: Für die Standardregelstrecke erfolgt die Berechnung der Wurzelortskurve.

# -*- coding: utf-8 -*-
"""
Standardregelstrecke G(s), Pole und rlocus

Created on 8.10. 2018
@author: philippsen
"""

import numpy as np
import control
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])

stand = control.tf(num,den)
po=control.pole(stand)
print(stand,'Die Pole sind : ',po)
control.root_locus(stand)

plt.title('Wurzelortskurve')
plt.grid()

web603

Ortskurven offene Kreis

Listing 6.3: Es werden drei Ortskurven und Sprungantworten für unterschiedliche Verstärkungen berechnet.

# -*- coding: utf-8 -*-
"""
Ortskurven, h(t) Standardregelstrecke und PI-Regler

Created on 21.3. 2019
@author: philippsen
"""

import numpy as np
import control
from  control.matlab import *
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 = control.matlab.tf(num,den)
regler = 1.0
G0 = regler*strecke
real, imag, ww = control.matlab.nyquist(G0,Plot=False)
plt.plot(real, imag, "b")
real, imag, ww = control.matlab.nyquist(2*G0,Plot=False)
plt.plot(real, imag, "r")
real, imag, ww = control.matlab.nyquist(4*G0,Plot=False)
plt.plot(real, imag, "g")
plt.title('Ortskurven')
plt.grid()
plt.show()
plt.figure()
Gw = feedback(G0, 1) #   Kreis
xx, tt = control.matlab.step(Gw)
plt.plot(tt,xx,"b")
Gw = feedback(2*G0, 1) #   Kreis
xx, tt = control.matlab.step(Gw)
plt.plot(tt,xx,"r")
Gw = feedback(4*G0, 1) #   Kreis
xx, tt = control.matlab.step(Gw)
plt.plot(tt,xx,"g")
plt.title('Regelkreis')
plt.xlabel('t [s]'); plt.ylabel('x(t)')
plt.grid()
plt.show()
#plt.gcf().clear() # So wird Plot gelöscht

web604

Betragsoptimum

Listing 6.4: Gezeigt wird der PID-Entwurf gemäß Betragsotimum für die Standardregelstrecke.

# -*- coding: utf-8 -*-
"""
Standardregelstrecke  G(s) Betragsoptimum

Created on 27.1. 2020
@author: philippsen
"""

import numpy as np
#import control
from  control.matlab import *
import matplotlib.pyplot as plt

a0 = 1.
a1 = 10.
a2 = 31.
a3 = 30. ; a4 =0; a5 = 0
b0 = 1.
num  = np.array([b0])
den  = np.array([a3, a2, a1, a0])
strecke = tf(num,den)
D =np.linalg.det([[a1, -a0, 0],
 	    [a3, -a2, a1],
	    [a5, -a4, a3]])

r0=np.linalg.det([[a0**2,   -a0, 0],
 	 [(-a1**2 + 2*a0*a2),    -a2, a1],
	 [(a2**2  + 2*a0*a4 -2*a1*a3),-a4, a3]])
r0 = r0/D

r1=np.linalg.det([[a1,   a0**2,		0],
 	  [a3, 	(-a1**2 + 2*a0*a2),	 	a1],
	  [a5,	(a2**2  + 2*a0*a4 -2*a1*a3),	 a3]])
r1 = r1/D

r2=np.linalg.det([[a1,    -a0,	 a0**2],
 	  [a3, 	-a2,	(-a1**2 + 2*a0*a2) ],
	  [a5,	-a4,	(a2**2  + 2*a0*a4 -2*a1*a3)]	])
r2 = r2/D

kr = r1/2
tn = r1/r0
tv = r2/r1 ; t1 = tv/5.0
#regler = tf([kr*tn*tv, kr*tn, kr],[tn, 0]) # ohne D-T1
regler = tf([kr*(tv+t1)*tn, kr*(tn+t1), kr],[tn*t1, tn, 0])
regelkreis = feedback(regler*strecke,1)
x, t = step(regelkreis)

stell = feedback(regler, strecke)
y, t = step(stell)

fig, ax1 = plt.subplots()

ax1.plot(t, x, "b") 
ax1.set_ylabel('x', color="blue") 
plt.grid()
plt.plot([0, 36], [0.97, 0.97], 'k--',color="blue")
plt.plot([0, 36], [1.03, 1.03], 'k--',color="blue")
ax2 = ax1.twinx() 
ax2.plot(t, y, "r") 
ax2.set_ylabel('y', color="red") 
ax1.set_xlabel('t [s]', fontsize=12) 
plt.title('Entwurf gemäß Betragsoptimum, Tol. +-3%')

Theme von Anders Norén