Download as pdf or txt
Download as pdf or txt
You are on page 1of 1

2021.9 Y.

Minami

Python-Control Cheat Sheet 3 Frequency response 5 Stability and Robustness


Pole & Zero P.pole()
from control.matlab import * Bode diagram
import numpy as np pzmap(P)
gain, phase, w = bode(P, logspace(-2,2)) P.zero()

1 System representation
Gain
Stability margin
Gain Gain margin
0[dB]
Transfer Function P = tf([0, 4], [1, 2, 3]) 20*np.log10(gain) [dB] <latexit sha1_base64="CA5VUgVuxhKR41Y6e4MPJEf6Plc=">AAACsXichVHLLgRRED3auz1mPBYSm4kJsZpUIyFiIbGx9BqPGBnd1zU6069090xCZ37AD1jYILHAZ9j4AQufIJYkNhZqeloEQd3ce+ueW6eqTsrwLDMIiR6alOaW1rb2jk61q7unN5Xu618P3IovZF64lutvGnogLdOR+dAMLbnp+VK3DUtuGOWF+v9GVfqB6Tpr4aEnd2y95Jj7ptBDhorpwYJnG5GaKbi2LOnFqCRqaq2YzlKOYsv8dLTEySKxJTd9iwL24EKgAhsSDkL2LegIeG1DA8FjbAcRYz57ZvwvUYPK3ApHSY7QGS3zWeLXdoI6/K7nDGK24CoWb5+ZGYzSPV3RM93RDT3S26+5ojhHvZdDvo0GV3rF1PHQ6uu/LJvvEAefrD96/ogNGPXjjiVHCkatf7SG2MdMzDBZsxcjdfWiUbd6dPK8OrsyGo3RBT2x7nN6oFtW7lRfxOWyXDmFyoPTvo/pp7M+kdMopy1PZefnkhF2YBgjGOc5TWMei1hCnuse4QxXuFYmlS1lVzEaoUpTwhnAF1PK77XLnRY=</latexit>
GM
GM, PM, wpc, wgc = margin(P)
print('GM=‘, 20*np.log10(GM))
s = tf('s')
P = 4/(s**2 + 2*s + 3)
Phase Phase Phase margin
print('PM=', PM)
print('wpc=', wpc) Phase crossover
phase*180/np.pi [deg] -180[deg] <latexit sha1_base64="B0+dQHYVl/axLSstnacrMXjQK0Q=">AAACsXichVHLLgRRED3auz1mPBYSm4kJsZpUIyFiIbGx9BqPGBnd1zU6069090xCZ37AD1jYILHAZ9j4AQufIJYkNhZqeloEQd3ce+ueW6eqTsrwLDMIiR6alOaW1rb2jk61q7unN5Xu618P3IovZF64lutvGnogLdOR+dAMLbnp+VK3DUtuGOWF+v9GVfqB6Tpr4aEnd2y95Jj7ptBDhorpwYJnG5GaKbi2LOnFyBM1tVZMZylHsWV+OlriZJHYkpu+RQF7cCFQgQ0JByH7FnQEvLahgeAxtoOIMZ89M/6XqEFlboWjJEfojJb5LPFrO0EdftdzBjFbcBWLt8/MDEbpnq7ome7ohh7p7ddcUZyj3ssh30aDK71i6nho9fVfls13iINP1h89f8QGjPpxx5IjBaPWP1pD7GMmZpis2YuRunrRqFs9OnlenV0Zjcbogp5Y9zk90C0rd6ov4nJZrpxC5cFp38f001mfyGmU05ansvNzyQg7MIwRjPOcpjGPRSwhz3WPcIYrXCuTypayqxiNUKUp4Qzgiynld8nnnR8=</latexit>

PM print('wgc=', wgc) Gain crossover


State-Space Equation A = [[0, 1],[-4, -5]]
B = [[0], [1]]
C = np.eye(2) Frequency response at multiple angular frequencies
w [rad/s]
6 Controller design
D = np.zeros([2, 1])
gain, phase, w = freqresp(sys, [omega])
P = ss(A, B, C, D)

Controllability and Reachability Matrix Nyquist diagram


Vc = ctrb(P.A, P.B) Vo = obsv(P.A, P.C) x, y, w = nyquist(P, logspace(-2,2,1000))
Pole = [-1, -2]
F = -acker(P.A, P.B, Pole)
Pade approximation Pole placement
2 Time response num, den = pade(0.5, 2) F = -place(P.A, P.B, Pole)
Pdelay = P*tf(num, den)
Impulse response
LQ optimal control Q = [ [100, 0], [0, 1]]
T = np.arange(0, 10, 0.01) Delay = 0.5[s] R = 1
y, t = impulse(P, T) 2nd order appr. P F, _, _ = lqr(P.A, P.B, Q, R)
0, 0.01, 0.02,…,9.99 F = -F
Pdelay
Step response solves the continuous-time algebraic Riccati equation

4
T = np.arange(0, 10, 0.01) (X, L, G) = care(A, B, Q, R)
y, t = step(P, T) Block diagram
Mixied sensitivity design from control import mixsyn
Step response characteristics series(S1,S2) parallel(S1,S2)
Initial condition response Info = stepinfo(sys) <latexit sha1_base64="q9jQeFqFfWF+DcoZdS2ETssh+Rw=">AAACpnichVG7SgNBFD1ZXzE+ErURbMSgWIWJCAargI2VqDFGSILujqMumX2wOwnEkB+wFwtBUbAQP8PGH7DIJ4ilgo2FN5sVUdHcZXfOnDnnzr17DVeavmKsFdF6evv6B6KDsaHhkdF4Ymx823eqHhd57kjH2zF0X0jTFnllKil2XE/oliFFwaistM8LNeH5pmNvqborypZ+aJsHJtcVUcWSpasjrstGrrmbSLIUC2L6N0iHIIkw1p3EPUrYhwOOKiwI2FCEJXT49BSRBoNLXBkN4jxCZnAu0ESMvFVSCVLoxFboe0i7YsjatG/n9AM3p1skvR45pzHLHtkte2EP7I49sfc/czWCHO1a6rQaHa9wd+Mnk7m3ri6LVoWjL9c/NX9qfWK9oGJBSk6s7NKrwgEygcOknt2AaXfPO/fWjs9ecsubs405ds2eqe8r1mL31Llde+U3G2LzHDEaXPrnmH6D7YVUmvDGYjKbCUcYxRRmME9zWkIWq1hHPvjTp7jApTavrWl5rdCRapHQM4Fvoe19AG+Dmbs=</latexit>
<latexit sha1_base64="q9jQeFqFfWF+DcoZdS2ETssh+Rw=">AAACpnichVG7SgNBFD1ZXzE+ErURbMSgWIWJCAargI2VqDFGSILujqMumX2wOwnEkB+wFwtBUbAQP8PGH7DIJ4ilgo2FN5sVUdHcZXfOnDnnzr17DVeavmKsFdF6evv6B6KDsaHhkdF4Ymx823eqHhd57kjH2zF0X0jTFnllKil2XE/oliFFwaistM8LNeH5pmNvqborypZ+aJsHJtcVUcWSpasjrstGrrmbSLIUC2L6N0iHIIkw1p3EPUrYhwOOKiwI2FCEJXT49BSRBoNLXBkN4jxCZnAu0ESMvFVSCVLoxFboe0i7YsjatG/n9AM3p1skvR45pzHLHtkte2EP7I49sfc/czWCHO1a6rQaHa9wd+Mnk7m3ri6LVoWjL9c/NX9qfWK9oGJBSk6s7NKrwgEygcOknt2AaXfPO/fWjs9ecsubs405ds2eqe8r1mL31Llde+U3G2LzHDEaXPrnmH6D7YVUmvDGYjKbCUcYxRRmME9zWkIWq1hHPvjTp7jApTavrWl5rdCRapHQM4Fvoe19AG+Dmbs=</latexit>
K, _, gamma = mixsyn(Sys, w1=WS , w2=WU, w3=WT)

7
T = np.arange(0, 10, 0.01)
Digitalization
<latexit sha1_base64="042ZTr/rlQtMnljtQxVxXlQAUpU=">AAACqHichVG7SgNBFD2urxhfURvBRgyKWMisCIpVwMYyD2MiMYTdcdTF2Ye7k4CG/IA/kMLGCBbiZ9j4AxZ+glgq2Fh4s1kRDeodZubMmXvug2t60goUY489Wm9f/8BgbCg+PDI6Np6YmNwJ3KrPRZ670vWLphEIaTkirywlRdHzhWGbUhTM4832f6Em/MBynW116omybRw61oHFDUVUec821BE3ZD3XqOiVRJIts9Bmu4EegSQiS7uJO+xhHy44qrAh4EARljAQ0CpBB4NHXBl14nxCVvgv0ECctFXyEuRhEHtM5yG9ShHr0LsdMwjVnLJI2j4pZzHPHtgNe2H37JY9sfdfY9XDGO1aTuk2O1rhVcbPp3Nv/6psuhWOvlR/1PzpGxDrhxUL8uTEyn96VTjAeqiwqGcvZNrd807e2lnzJbeRna8vsCv2TH232CO7o86d2iu/zojsBeI0OP3nmLrBzsqyTjizmkytRyOMYQZzWKQ5rSGFLaSRp7wnaOISLW1JS2sFbbfjqvVEmil8M838AAPcml8=</latexit>

<latexit sha1_base64="fQe4ILF5o8te2XhAEjzAbdXu9ds=">AAACqHichVG7SgNBFD1Z3/EVtRFsxBARC5kEQbESbCxjYh6ShLA7jrpk9uHuJKDBH/AHLGyMYCF+ho0/YOEniKWCjYU3mxXRoLnDzJw5c899cA1Xmr5i7Cmi9fUPDA4Nj0RHx8YnJmNT03nfqXtc5LgjHa9o6L6Qpi1yylRSFF1P6JYhRcGobbX/Cw3h+aZj76oTV1Qs/dA2D0yuK6IqZUtXR1yXzexZNVWNxdkKC2y+GyRDEEdoaSd2jzL24YCjDgsCNhRhCR0+rRKSYHCJq6BJnEfIDP4FzhAlbZ28BHnoxNboPKRXKWRterdj+oGaUxZJ2yPlPBLskd2yV/bA7tgz+/gzVjOI0a7lhG6joxVudfJ8NvveU2XRrXD0rfqn5i9fn1gvqFiQJydW9uhV4QDrgcKknt2AaXfPO3kbpxev2Y1MornIrtkL9d1iT+yeOrcbb/xmR2QuEaXBJX+PqRvkUytJwjur8c31cITDmMMClmhOa9jENtLIUd5jXOAKLW1ZS2sFba/jqkVCzQx+mGZ8AgYUmmA=</latexit>

<latexit sha1_base64="042ZTr/rlQtMnljtQxVxXlQAUpU=">AAACqHichVG7SgNBFD2urxhfURvBRgyKWMisCIpVwMYyD2MiMYTdcdTF2Ye7k4CG/IA/kMLGCBbiZ9j4AxZ+glgq2Fh4s1kRDeodZubMmXvug2t60goUY489Wm9f/8BgbCg+PDI6Np6YmNwJ3KrPRZ670vWLphEIaTkirywlRdHzhWGbUhTM4832f6Em/MBynW116omybRw61oHFDUVUec821BE3ZD3XqOiVRJIts9Bmu4EegSQiS7uJO+xhHy44qrAh4EARljAQ0CpBB4NHXBl14nxCVvgv0ECctFXyEuRhEHtM5yG9ShHr0LsdMwjVnLJI2j4pZzHPHtgNe2H37JY9sfdfY9XDGO1aTuk2O1rhVcbPp3Nv/6psuhWOvlR/1PzpGxDrhxUL8uTEyn96VTjAeqiwqGcvZNrd807e2lnzJbeRna8vsCv2TH232CO7o86d2iu/zojsBeI0OP3nmLrBzsqyTjizmkytRyOMYQZzWKQ5rSGFLaSRp7wnaOISLW1JS2sFbbfjqvVEmil8M838AAPcml8=</latexit>

X0 = [0, -1] <latexit sha1_base64="8feZEoK9b9JChDfQwKyqBk5rKeM=">AAAConichVG7SgNRED2urxhfURvBJhgVQQizIihWARuxSowxQhJkd72JS/bF7iYQQ37AzkowlYKF+Bk2/oBFPkEsFWwsnGxWREWdZe8999xz5s4wqmPonk/U6ZP6BwaHhiMj0dGx8YnJ2NT0vmfXXE3kNNuw3QNV8YShWyLn674hDhxXKKZqiLxa3ere5+vC9XTb2vMbjiiZSsXSy7qm+Ezli46pNldah7EEJSmI+E8ghyCBMNJ27A5FHMGGhhpMCFjwGRtQ4PFXgAyCw1wJTeZcRnpwL9BClL01VglWKMxWea3wqRCyFp+7Ob3ArfErBv8uO+NYpAe6oWe6p1t6pLdfczWDHN1aGryrPa9wDidPZ7Ov/7pM3n0cf7r+qPlD6zHrBhULVmrMGv/06qOMjcChc89OwHS713rv1k/On7Obu4vNJbqiJ+77kjp0x51b9RftOiN224jy4OTvY/oJ9leTMiXlzFoitRaOMII5zGOZ57SOFLaRRi6o7gwXaEsL0o6UkbI9qdQXembwJaTiO+EAl8w=</latexit>

y, t = initial(P, T, X0) <latexit sha1_base64="q9jQeFqFfWF+DcoZdS2ETssh+Rw=">AAACpnichVG7SgNBFD1ZXzE+ErURbMSgWIWJCAargI2VqDFGSILujqMumX2wOwnEkB+wFwtBUbAQP8PGH7DIJ4ilgo2FN5sVUdHcZXfOnDnnzr17DVeavmKsFdF6evv6B6KDsaHhkdF4Ymx823eqHhd57kjH2zF0X0jTFnllKil2XE/oliFFwaistM8LNeH5pmNvqborypZ+aJsHJtcVUcWSpasjrstGrrmbSLIUC2L6N0iHIIkw1p3EPUrYhwOOKiwI2FCEJXT49BSRBoNLXBkN4jxCZnAu0ESMvFVSCVLoxFboe0i7YsjatG/n9AM3p1skvR45pzHLHtkte2EP7I49sfc/czWCHO1a6rQaHa9wd+Mnk7m3ri6LVoWjL9c/NX9qfWK9oGJBSk6s7NKrwgEygcOknt2AaXfPO/fWjs9ecsubs405ds2eqe8r1mL31Llde+U3G2LzHDEaXPrnmH6D7YVUmvDGYjKbCUcYxRRmME9zWkIWq1hHPvjTp7jApTavrWl5rdCRapHQM4Fvoe19AG+Dmbs=</latexit>

<latexit sha1_base64="8feZEoK9b9JChDfQwKyqBk5rKeM=">AAAConichVG7SgNRED2urxhfURvBJhgVQQizIihWARuxSowxQhJkd72JS/bF7iYQQ37AzkowlYKF+Bk2/oBFPkEsFWwsnGxWREWdZe8999xz5s4wqmPonk/U6ZP6BwaHhiMj0dGx8YnJ2NT0vmfXXE3kNNuw3QNV8YShWyLn674hDhxXKKZqiLxa3ere5+vC9XTb2vMbjiiZSsXSy7qm+Ezli46pNldah7EEJSmI+E8ghyCBMNJ27A5FHMGGhhpMCFjwGRtQ4PFXgAyCw1wJTeZcRnpwL9BClL01VglWKMxWea3wqRCyFp+7Ob3ArfErBv8uO+NYpAe6oWe6p1t6pLdfczWDHN1aGryrPa9wDidPZ7Ov/7pM3n0cf7r+qPlD6zHrBhULVmrMGv/06qOMjcChc89OwHS713rv1k/On7Obu4vNJbqiJ+77kjp0x51b9RftOiN224jy4OTvY/oJ9leTMiXlzFoitRaOMII5zGOZ57SOFLaRRi6o7gwXaEsL0o6UkbI9qdQXembwJaTiO+EAl8w=</latexit>

Zero Order Hold ts = 0.2


Forced response
<latexit sha1_base64="fQe4ILF5o8te2XhAEjzAbdXu9ds=">AAACqHichVG7SgNBFD1Z3/EVtRFsxBARC5kEQbESbCxjYh6ShLA7jrpk9uHuJKDBH/AHLGyMYCF+ho0/YOEniKWCjYU3mxXRoLnDzJw5c899cA1Xmr5i7Cmi9fUPDA4Nj0RHx8YnJmNT03nfqXtc5LgjHa9o6L6Qpi1yylRSFF1P6JYhRcGobbX/Cw3h+aZj76oTV1Qs/dA2D0yuK6IqZUtXR1yXzexZNVWNxdkKC2y+GyRDEEdoaSd2jzL24YCjDgsCNhRhCR0+rRKSYHCJq6BJnEfIDP4FzhAlbZ28BHnoxNboPKRXKWRterdj+oGaUxZJ2yPlPBLskd2yV/bA7tgz+/gzVjOI0a7lhG6joxVudfJ8NvveU2XRrXD0rfqn5i9fn1gvqFiQJydW9uhV4QDrgcKknt2AaXfPO3kbpxev2Y1MornIrtkL9d1iT+yeOrcbb/xmR2QuEaXBJX+PqRvkUytJwjur8c31cITDmMMClmhOa9jENtLIUd5jXOAKLW1ZS2sFba/jqkVCzQx+mGZ8AgYUmmA=</latexit>

Pd = c2d(P, ts, method='zoh')


<latexit sha1_base64="042ZTr/rlQtMnljtQxVxXlQAUpU=">AAACqHichVG7SgNBFD2urxhfURvBRgyKWMisCIpVwMYyD2MiMYTdcdTF2Ye7k4CG/IA/kMLGCBbiZ9j4AxZ+glgq2Fh4s1kRDeodZubMmXvug2t60goUY489Wm9f/8BgbCg+PDI6Np6YmNwJ3KrPRZ670vWLphEIaTkirywlRdHzhWGbUhTM4832f6Em/MBynW116omybRw61oHFDUVUec821BE3ZD3XqOiVRJIts9Bmu4EegSQiS7uJO+xhHy44qrAh4EARljAQ0CpBB4NHXBl14nxCVvgv0ECctFXyEuRhEHtM5yG9ShHr0LsdMwjVnLJI2j4pZzHPHtgNe2H37JY9sfdfY9XDGO1aTuk2O1rhVcbPp3Nv/6psuhWOvlR/1PzpGxDrhxUL8uTEyn96VTjAeqiwqGcvZNrd807e2lnzJbeRna8vsCv2TH232CO7o86d2iu/zojsBeI0OP3nmLrBzsqyTjizmkytRyOMYQZzWKQ5rSGFLaSRp7wnaOISLW1JS2sFbbfjqvVEmil8M838AAPcml8=</latexit>

<latexit sha1_base64="8feZEoK9b9JChDfQwKyqBk5rKeM=">AAAConichVG7SgNRED2urxhfURvBJhgVQQizIihWARuxSowxQhJkd72JS/bF7iYQQ37AzkowlYKF+Bk2/oBFPkEsFWwsnGxWREWdZe8999xz5s4wqmPonk/U6ZP6BwaHhiMj0dGx8YnJ2NT0vmfXXE3kNNuw3QNV8YShWyLn674hDhxXKKZqiLxa3ere5+vC9XTb2vMbjiiZSsXSy7qm+Ezli46pNldah7EEJSmI+E8ghyCBMNJ27A5FHMGGhhpMCFjwGRtQ4PFXgAyCw1wJTeZcRnpwL9BClL01VglWKMxWea3wqRCyFp+7Ob3ArfErBv8uO+NYpAe6oWe6p1t6pLdfczWDHN1aGryrPa9wDidPZ7Ov/7pM3n0cf7r+qPlD6zHrBhULVmrMGv/06qOMjcChc89OwHS713rv1k/On7Obu4vNJbqiJ+77kjp0x51b9RftOiN224jy4OTvY/oJ9leTMiXlzFoitRaOMII5zGOZ57SOFLaRRi6o7gwXaEsL0o6UkbI9qdQXembwJaTiO+EAl8w=</latexit>

Negative FB
T = np.arange(0, 10, 0.01)
U = np.sin(5*T)
feedback(S1,S2, sign=-1) Tustin ts = 0.2
minreal(sys) Transformation Pd = c2d(P, ts, method='tustin')
<latexit sha1_base64="fQe4ILF5o8te2XhAEjzAbdXu9ds=">AAACqHichVG7SgNBFD1Z3/EVtRFsxBARC5kEQbESbCxjYh6ShLA7jrpk9uHuJKDBH/AHLGyMYCF+ho0/YOEniKWCjYU3mxXRoLnDzJw5c899cA1Xmr5i7Cmi9fUPDA4Nj0RHx8YnJmNT03nfqXtc5LgjHa9o6L6Qpi1yylRSFF1P6JYhRcGobbX/Cw3h+aZj76oTV1Qs/dA2D0yuK6IqZUtXR1yXzexZNVWNxdkKC2y+GyRDEEdoaSd2jzL24YCjDgsCNhRhCR0+rRKSYHCJq6BJnEfIDP4FzhAlbZ28BHnoxNboPKRXKWRterdj+oGaUxZJ2yPlPBLskd2yV/bA7tgz+/gzVjOI0a7lhG6joxVudfJ8NvveU2XRrXD0rfqn5i9fn1gvqFiQJydW9uhV4QDrgcKknt2AaXfPO3kbpxev2Y1MornIrtkL9d1iT+yeOrcbb/xmR2QuEaXBJX+PqRvkUytJwjur8c31cITDmMMClmhOa9jENtLIUd5jXOAKLW1ZS2sFba/jqkVCzQx+mGZ8AgYUmmA=</latexit>

y, t, x0 = lsim(P, U, T)

You might also like