Advertisement
Guest User

Untitled

a guest
Nov 19th, 2019
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.20 KB | None | 0 0
  1. import numpy as np
  2. from matplotlib import pyplot as plt
  3. from scipy.signal import tf2ss
  4.  
  5.  
  6. def PID(ss,dt,T,k,Ti=None,Td=None):
  7.  
  8. A,B,C,D = ss
  9. t = np.arange(0,T,dt)
  10. n = len(t)
  11. count_of_parameters = A.shape[0]
  12. xs = np.zeros((count_of_parameters,n+1))
  13. ys = np.zeros((1,n))
  14. set_point = 20
  15. prev_err,err = set_point,set_point
  16. acc_I = 0
  17.  
  18. for i in range(0,n):
  19. P = k * err
  20. I = (k/Ti)*err + acc_I if Ti is not None else 0
  21. regD = k*Td * (err - prev_err) if Td is not None else 0
  22.  
  23. u = P + I + regD
  24.  
  25. x = np.transpose(np.dot(A,xs[:,i].reshape(count_of_parameters,1)) + B*u)
  26. xs[:,i+1] = xs[:,i] + x*dt
  27. y = np.dot(C,xs[:,i].reshape(count_of_parameters,1)) + D*u
  28. ys[0,i] = set_point - y
  29.  
  30. prev_err,err = err,set_point - y
  31. acc_I = I
  32.  
  33. return t, ys[0,:]
  34.  
  35. def Q(ss,dt,T,k,Ti=None,Td=None):
  36.  
  37. A,B,C,D = ss
  38. t = np.arange(0,T,dt)
  39. n = len(t)
  40. count_of_parameters = A.shape[0]
  41. xs = np.zeros((count_of_parameters,n+1))
  42. ys = np.zeros((1,n))
  43. es = np.zeros((1,n))
  44. set_point = 20
  45. prev_err,err = set_point,set_point
  46. acc_I = 0
  47.  
  48. for i in range(0,n):
  49. P = k*err
  50. I = (k/Ti)*err + acc_I if Ti is not None else 0
  51. regD = k*Td*(err - prev_err) if Td is not None else 0
  52.  
  53. u = P + I + regD
  54.  
  55. x = np.transpose(np.dot(A,xs[:,i].reshape(count_of_parameters,1)) + B*u)
  56. xs[:,i+1] = xs[:,i] + x*dt
  57. y = np.dot(C,xs[:,i].reshape(count_of_parameters,1)) + D*u
  58. ys[0,i] = set_point - y
  59.  
  60. prev_err,err = err, set_point-y
  61. es[0,i] = err
  62. acc_I = I
  63.  
  64. es = es - es[0,n-1]
  65. es = es ** 2
  66. es = es * dt
  67.  
  68. return np.sum(es)
  69.  
  70.  
  71. def Qk(ss,dt,T,Ti=None,Td=None):
  72. ks = np.arange(0,8,0.2)
  73. Qs = np.zeros((1,ks.size))
  74.  
  75. for i,k in enumerate(ks):
  76. Qs[0,i] = Q(ss=ss,dt=dt,T=T,k=k,Ti=Ti,Td=Td)
  77.  
  78. return ks,Qs[0,:]
  79.  
  80. def QTi(ss,dt,T,k,Td=None):
  81. Tis = np.arange(100,700,10)
  82. Qs = np.zeros((1,Tis.size))
  83.  
  84. for i, Ti in enumerate(Tis):
  85. Qs[0,i] = Q(ss=ss,dt=dt,T=T,k=k,Ti=Ti,Td=Td)
  86.  
  87. return Tis,Qs[0,:]
  88.  
  89. def QTd(ss,dt,T,k,Ti=None):
  90. Tds = np.arange(0.0001,0.08,0.0008)
  91. Qs = np.zeros((1,Tds.size))
  92.  
  93. for i,Td in enumerate(Tds):
  94. Qs[0,i] = Q(ss=ss,dt=dt,T=T,k=k,Ti=Ti,Td=Td)
  95.  
  96. return Tds,Qs[0,:]
  97.  
  98. if __name__ == "__main__" :
  99.  
  100. num = [2]
  101. den = [1,5,4,3]
  102. ss = tf2ss(num,den)
  103.  
  104. # num = [2]
  105. # den = [1, 5, 4, 3]
  106. # ss = tf2ss(num, den)
  107.  
  108. # num1 = [2]
  109. # den1 = [1,5,4,3]
  110. # ss1 = tf2ss(num1,den1)
  111. #
  112. # num2 = [2]
  113. # den2 = [2, 5, 4, 3]
  114. # ss2 = tf2ss(num2, den2)
  115. #
  116. # num3 = [2]
  117. # den3 = [3,5,4,3]
  118. # ss3 = tf2ss(num3,den3)
  119.  
  120.  
  121. ### WYKRES DLA MICHALA
  122.  
  123. # plt.title("Wykres dla kolegi")
  124. # plt.plot(*Qk(ss=ss,dt=0.05,T=50),"*")
  125. # plt.grid()
  126. # plt.show()
  127.  
  128. ### ZABAWA Z ZIEGLEREM NICHOLSEM
  129. # plt.title("Szukamy oscylacji")
  130. # plt.plot(*PID(ss=ss,dt=0.005,T=50,k=4.01, Ti=1.35, Td=1.925))
  131. # plt.show()
  132.  
  133. ### WYKRES 0
  134. # plt.title("Porownanie wykresow dla m = 1 (czerwony) 2 (niebieski) 3 (zielony)")
  135. # plt.plot(*PID(ss=ss1,dt=0.005,T=100,k=0.5),"r")
  136. # plt.plot(*PID(ss=ss2, dt=0.005, T=100, k=0.5), "b")
  137. # plt.plot(*PID(ss=ss3, dt=0.005, T=100, k=0.5), "g")
  138. # plt.show()
  139.  
  140. ### WYKRES 1
  141. # plt.title("Regulator P: k = 0.5 (czerwony), 2 (zielony), 5 (niebieski)")
  142. # plt.grid()
  143. # plt.xlabel('czas (s) →')
  144. # plt.ylabel('uchyb →')
  145. # plt.plot(*PID(ss=ss,dt=0.005,T=100,k=0.5),"r")
  146. # plt.plot(*PID(ss=ss, dt=0.005, T=100, k=2), "g")
  147. # plt.plot(*PID(ss=ss, dt=0.005, T=100, k=5), "b")
  148. # plt.show()
  149.  
  150. ### WYKRES 2
  151. # plt.title("Regulator P: k = 7 (czerwony), 8 (zielony), 8.4 (niebieski)")
  152. # plt.grid()
  153. # plt.xlabel('czas (s) →')
  154. # plt.ylabel('uchyb →')
  155. # plt.plot(*PID(ss=ss, dt=0.005, T=100, k=7), "r")
  156. # plt.plot(*PID(ss=ss, dt=0.005, T=100, k=8), "g")
  157. # plt.plot(*PID(ss=ss, dt=0.005, T=100, k=8.4), "b")
  158. # plt.show()
  159.  
  160. ### WYKRES 3
  161. # plt.title("Regulator PI: k = 0.5 Ti = 70 (czerwony), 80 (zielony), 100 (niebieski)")
  162. # plt.grid()
  163. # plt.xlabel('czas (s) →')
  164. # plt.ylabel('uchyb →')
  165. # plt.plot(*PID(ss=ss, dt=0.005, T=50, k=0.5, Ti=70), "r")
  166. # plt.plot(*PID(ss=ss, dt=0.005, T=50, k=0.5, Ti=80), "g")
  167. # plt.plot(*PID(ss=ss, dt=0.005, T=50, k=0.5, Ti=100), "b")
  168. # plt.show()
  169.  
  170. ### WYKRES 4
  171. # plt.title("Regulator PI: k = 0.5 Ti = 100 (czerwony), 150 (zielony), 200 (niebieski), 500 (fioletowy)")
  172. # plt.grid()
  173. # plt.xlabel('czas (s) →')
  174. # plt.ylabel('uchyb →')
  175. # plt.plot(*PID(ss=ss, dt=0.005, T=50, k=0.5, Ti=100), "r")
  176. # plt.plot(*PID(ss=ss, dt=0.005, T=50, k=0.5, Ti=150), "g")
  177. # plt.plot(*PID(ss=ss, dt=0.005, T=50, k=0.5, Ti=200), "b")
  178. # plt.plot(*PID(ss=ss, dt=0.005, T=50, k=0.5, Ti=500), "purple")
  179. # plt.show()
  180.  
  181. ### WYKRES 5
  182. # plt.title("Regulator PI: k = 0.5 Ti = 150, Td = 0.0001")
  183. # plt.grid()
  184. # plt.xlabel('czas (s) →')
  185. # plt.ylabel('uchyb →')
  186. # plt.plot(*PID(ss=ss, dt=0.005, T=50, k=0.5, Ti=150,Td = 0.002), "r")
  187. # plt.show()
  188.  
  189. ### WYKRES 6
  190. # plt.title("Dobór parametrów regulatora P")
  191. # plt.grid()
  192. # plt.xlabel('k →')
  193. # plt.ylabel('Q(fk) →')
  194. # plt.plot(*Qk(ss=ss, dt=0.005, T=50), "*")
  195. # plt.show()
  196.  
  197. ### WYKRES 7
  198. # plt.title("Dobór parametrów regulatora PI przy k=2")
  199. # plt.grid()
  200. # plt.xlabel('k →')
  201. # plt.ylabel('Q(fk) →')
  202. # plt.plot(*QTi(ss=ss, dt=0.005, T=50,k=2), "*")
  203. # plt.show()
  204.  
  205. ### WYKRES 8
  206. # plt.title("Dobór parametrów regulatora PI przy k=0.5")
  207. # plt.grid()
  208. # plt.xlabel('k →')
  209. # plt.ylabel('Q(fk) →')
  210. # plt.plot(*QTi(ss=ss, dt=0.005, T=50, k=0.5), "*")
  211. # plt.show()
  212.  
  213. ### WYKRES 9
  214. plt.title("PID dla k=0.5, Ti=150, Td= 0.001 (niebieski) 200 (czerwony)")
  215. plt.grid()
  216. plt.xlabel('czas')
  217. plt.ylabel('uchyb')
  218. plt.plot(*PID(ss=ss, dt=0.005, T=50, k=0.5,Ti=150, Td=0.001), "b")
  219. plt.plot(*PID(ss=ss, dt=0.005, T=50, k=0.5, Ti=150, Td=200), "r")
  220. plt.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement