Advertisement
shmile03

Untitled

May 5th, 2025
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.39 KB | None | 0 0
  1. import numpy as np
  2. import control
  3. import matplotlib.pyplot as plt
  4.  
  5. # 1) Задаём параметры
  6. A = np.array([[0,      0,       1,      0],
  7.               [0,      0,       0,      1],
  8.               [0, 5.8773, -1.9436, -0.3484],
  9.               [0, 24.5313, -0.3823, -1.4543]])
  10. B = np.array([[0],
  11.               [0],
  12.               [6.2491],
  13.               [1.2311]])
  14. Q = np.diag([100, 0, 0, 0])
  15. R = np.array([[1]])
  16.  
  17. # 2) Решаем LQR — получаем K, решение Риккати X и собственные числа E
  18. K, X, E = control.lqr(A, B, Q, R)
  19.  
  20. # 5) Начальные условия и временная сетка
  21. x0 = [0, np.pi/17, 0, 0]
  22. t = np.linspace(0, 10, 1001)
  23.  
  24. #
  25. control_coefs = -K
  26.  
  27. theta_ddot_func, phi_ddot_func = non_lin_theta_phi_funcs(lhs_1, lhs_2)
  28. theta_ddot_func = theta_ddot_func.subs(parameters)
  29. phi_ddot_func = phi_ddot_func.subs(parameters)
  30.  
  31. controled_theta_ddot_func = add_control(theta_ddot_func,control_coefs)
  32. controled_phi_ddot_func = add_control(phi_ddot_func,control_coefs)
  33.  
  34. theta_ddot_lamb = sp.lambdify(vars_vector, controled_theta_ddot_func)
  35. phi_ddot_lamb = sp.lambdify(vars_vector, controled_phi_ddot_func)
  36.  
  37. non_lin_sys = non_lin_sys_creator(theta_ddot_lamb, phi_ddot_lamb)
  38.  
  39. non_lin_sol = solve_ivp(fun = non_lin_sys,y0 = x0[:4],t_span = (t[0],t[-1]), t_eval = t, rtol = 1e-2)
  40. #
  41.  
  42.  
  43. # 3) Замкнутая матрица системы
  44. A_cl = A - B @ K
  45.  
  46. # 4) Формируем модель состояния-выхода для замкнутой системы
  47. #    Здесь C=I, D=0 чтобы на выходе видеть сами состояния
  48. C = np.eye(4)
  49. D = np.zeros((4, 1))
  50. sys_cl = control.ss(A_cl, B, C, D)
  51.  
  52. # 6) Моделируем свободную (нулевой вход) динамику системы от x0
  53. t_out, y_out = control.initial_response(sys_cl, T=t, X0=x0)
  54.  
  55. # 7) Рисуем 4 графика переменных состояния
  56. labels = [r'$\theta$', r'$\varphi$', r'$\dot{\theta}$', r'$\dot{\varphi}$']
  57. fig, axes = plt.subplots(4, 1, figsize=(8, 10), sharex=True)
  58.  
  59. for i in range(4):
  60.     axes[i].plot(t_out, y_out[i, :], 'b', label="линейная")
  61.     axes[i].plot(non_lin_sol["t"], non_lin_sol["y"][i], 'r', label="нелинейная")
  62.     axes[i].set_ylabel(labels[i], fontweight='bold')
  63.     axes[i].legend()
  64.     axes[i].set_xlabel('t')
  65.  
  66. #plt.tight_layout()
  67. plt.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement