Advertisement
shmile03

Untitled

May 5th, 2025
281
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.40 KB | None | 0 0
  1. Ad = np.array([[ 1.00000000e+00,  2.68170103e-02,  9.08934014e-02,
  2.         -6.77884181e-04],
  3.        [ 0.00000000e+00,  1.11897831e+00, -1.74689726e-03,
  4.          9.69312804e-02],
  5.        [ 0.00000000e+00,  5.17634358e-01,  8.23599851e-01,
  6.         -3.86676206e-03],
  7.        [ 0.00000000e+00,  2.36782487e+00, -3.37194203e-02,
  8.          9.78620935e-01]])
  9. Bd = np.array([[0.02927989],
  10.        [0.00561669],
  11.        [0.56716864],
  12.        [0.108416  ]])
  13.  
  14. def obs_d_sys_creator(A, B, C, mu_ctrl = None, mu_obs = None, D = None):
  15.     theta = control.place(A, B, mu_ctrl) *(-1) if (not mu_ctrl is None) else np.matrix(np.zeros(A.shape[1]))
  16.     L = control.place(A.T, C.T, mu_obs).T  if (not mu_obs is None) else np.matrix(np.zeros(A.shape[1])).T
  17.  
  18.     my_min = lambda x,y: (min(x[0],y[0]),min(x[1],y[1]))
  19.  
  20.     if D is None:
  21.         D = np.zeros(A.shape[0])
  22.     sys_matrix = np.block([
  23.         [A, B@theta],
  24.         [L@C,B@theta+ A - L@C]
  25.     ])
  26.     def rhs(X):
  27.         X = np.matrix(X)
  28.         return (sys_matrix@X.T).T
  29.     return rhs
  30.  
  31. Cd = np.matrix([
  32.     [1,0,0,0],
  33.     [0,1,0,0]
  34. ])
  35.  
  36. eigs = np.linalg.eigvals(Ad)
  37. display(eigs)
  38. mu_ctrl = copy(eigs.tolist())
  39. mu_obs = copy(mu_ctrl)
  40.  
  41. #case 1:(a)
  42. mu_obs[0] = -0.1
  43. mu_obs[1] = -0.2
  44. #case 2:(b)
  45. mu_obs[0] = 0.8 +0.3j
  46. mu_obs[1] = 0.8 - 0.3j
  47. #case 3:(c)
  48. mu_obs[0] = -0.1
  49. mu_obs[1] = 1
  50.  
  51. mu_ctrl[0] =  0.8 + 0.3j
  52. mu_ctrl[1] =  0.8 - 0.3j
  53.  
  54. obs_dis_sys = obs_d_sys_creator(Ad,Bd,Cd, mu_ctrl = mu_ctrl, mu_obs = mu_obs)
  55.  
  56. L_coefs = control.place(Ad.T, Cd.T, mu_obs).T
  57. control_coefs = -control.place(Ad,Bd, mu_ctrl)
  58. control_coefs
  59.  
  60. discret_t_arr = np.arange(0,4+0.1,h)
  61. discret_y0 = (0,np.pi/20,0,0,0,0,0,0)
  62.  
  63. discret_y = [discret_y0]
  64. for i in range(1,len(discret_t_arr)):
  65.     cur_x = obs_dis_sys(discret_y[-1])
  66.     discret_y.append(cur_x.tolist()[0])
  67. discret_y = np.matrix(discret_y).T
  68. #display(discret_y.shape)
  69. u_arr = np.block([(control_coefs@x[0,4:8].T)[0,0] for x in discret_y.T][:-1])
  70. u_arr
  71.  
  72. def to_plot_arr(arr_1, arr_2):
  73.     plot_arr_1 = np.block([
  74.         np.matrix(arr_1).T[:-1], np.matrix(arr_1).T[1:]
  75.     ])
  76.  
  77.     plot_arr_2 = np.block([
  78.         np.matrix(arr_2).T,np.matrix(arr_2).T
  79.     ])
  80.     return plot_arr_1.ravel().tolist()[0], plot_arr_2.ravel().tolist()[0]
  81.  
  82. #используя полученные коэффициенты управления построим непрерывную линейную систему
  83. def discret_controled_system(A,B,u):
  84.     def rhs(t,X):
  85.         X = np.matrix(X)
  86.         return (A@X.T+B*u).T
  87.     return rhs
  88.  
  89. lin_sol_arr = []
  90. cur_start_pos = discret_y0[:4]
  91.  
  92. cur_t_limits = [0,0]
  93.  
  94. for t,u in zip(discret_t_arr[1:],u_arr):
  95.     discret_controled_lin_sys = discret_controled_system(nA,nB,u)
  96.     cur_t_limits[0] = cur_t_limits[1]
  97.     cur_t_limits[1] = t
  98.     cur_sol = solve_ivp(discret_controled_lin_sys,y0 = cur_start_pos, t_span = cur_t_limits, t_eval = np.linspace(*cur_t_limits,10), rtol = 1e-12)
  99.     cur_start_pos = cur_sol.y[:,-1]
  100.     lin_sol_arr.append(cur_sol)
  101.  
  102. lin_t_arr = np.block([x.t for x in lin_sol_arr])
  103. lin_y_arr = np.block([x.y for x in lin_sol_arr])
  104.  
  105. from tqdm import tqdm
  106. #символьное вычисление функций
  107. #theta_ddot_func, phi_ddot_func = non_lin_theta_phi_funcs(lhs_1, lhs_2)
  108. #определение н.у.
  109. cur_start_pos = discret_y0[:4]
  110. cur_t_limits = [0,0]
  111.  
  112. non_lin_sol_arr = []
  113. for t,u in tqdm(zip(discret_t_arr[1:],u_arr)):
  114.     #расчёт системы для текущих н.у.
  115.     controled_theta_ddot_func = theta_ddot_func.subs(parameters).subs({V:u})
  116.     controled_phi_ddot_func = phi_ddot_func.subs(parameters).subs({V:u})
  117.     theta_ddot_lamb, phi_ddot_lamb = non_lin_sys_lambdify(controled_theta_ddot_func, controled_phi_ddot_func)
  118.     non_lin_sys = non_lin_sys_creator(theta_ddot_lamb, phi_ddot_lamb)
  119.  
  120.     cur_t_limits[0] = cur_t_limits[1]
  121.     cur_t_limits[1] = t
  122.     #численное решение
  123.     non_lin_sol = solve_ivp(fun = non_lin_sys,y0 = cur_start_pos,t_span = cur_t_limits, t_eval = np.linspace(*cur_t_limits,10), rtol = 1e-12)
  124.     cur_start_pos = non_lin_sol.y[:,-1]
  125.  
  126.     non_lin_sol_arr.append(non_lin_sol)
  127.  
  128. non_lin_t_arr = np.block([x.t for x in non_lin_sol_arr])
  129. non_lin_y_arr = np.block([x.y for x in non_lin_sol_arr])
  130.  
  131. fig, ax = plt.subplots(5,2,figsize = (20,10))
  132. ylabel_params = [r'\theta',r'\varphi',r'\dot{\theta}',r'\dot{\varphi}','V']
  133. for i in range(len(ylabel_params)):
  134.     ax[i,0].set_ylabel(f"${ylabel_params[i]}$")
  135.     ax[i,1].set_ylabel(f"${ylabel_params[i]}$")
  136.  
  137.  
  138. for i,y in enumerate(non_lin_y_arr):
  139.     ax[i,0].plot(non_lin_t_arr,y, color = 'green', label = 'состояние нелин.')
  140. for i in range(4):
  141.     cur_y = discret_y[4+i,:-1]
  142.     x,y = to_plot_arr(discret_t_arr,cur_y)
  143.     ax[i,0].plot(x,y, color = 'orange',linestyle='--', label = 'состояние наблюдателя.')
  144. for i in range(4):
  145.     cur_y = discret_y[i,:-1]
  146.     x,y = to_plot_arr(discret_t_arr,cur_y)
  147.     ax[i,0].plot(x,y, color = 'pink',linestyle='--', label = 'состояние дискр. сис')
  148. for i in range(4):
  149.     cur_y1 = discret_y[i,:-1]
  150.     cur_y2 = discret_y[i+4,:-1]
  151.     x,y = to_plot_arr(discret_t_arr,abs(cur_y2-cur_y1))
  152.     ax[i,1].plot(x,y, color = 'pink',linestyle='--', label = 'невязка наблюдателя')
  153.  
  154.  
  155. for i,y in enumerate(lin_y_arr):
  156.     ax[i,0].plot(lin_t_arr,y, color = 'red', label = 'состояние лин.')
  157.  
  158. ax[4,0].plot(*to_plot_arr(discret_t_arr,u_arr))
  159. ax[0,0].legend()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement