Advertisement
mirosh111000

Мірошниченко_Артем_ПМ-11_Лр№6_Мет_комп_експ

May 11th, 2024
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.20 KB | None | 0 0
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from mpl_toolkits.mplot3d import Axes3D
  4. from scipy.integrate import solve_ivp
  5. from joblib import Parallel, delayed
  6. from multiprocessing import current_process
  7.  
  8.  
  9.  
  10. def system(x, y, z, a, b, c):
  11.     dx_dt = -y - z
  12.     dy_dt = x + a * y
  13.     dz_dt = b + z * (x - c)
  14.     return dx_dt, dy_dt, dz_dt
  15.  
  16. def runge_kutta(x, y, z, a, b, c, dt):
  17.     k1x, k1y, k1z = system(x, y, z, a, b, c)
  18.     k2x, k2y, k2z = system(x + 0.5 * k1x * dt, y + 0.5 * k1y * dt, z + 0.5 * k1z * dt, a, b, c)
  19.     k3x, k3y, k3z = system(x + 0.5 * k2x * dt, y + 0.5 * k2y * dt, z + 0.5 * k2z * dt, a, b, c)
  20.     k4x, k4y, k4z = system(x + k3x * dt, y + k3y * dt, z + k3z * dt, a, b, c)
  21.     x_new = x + (k1x + 2 * k2x + 2 * k3x + k4x) * dt / 6
  22.     y_new = y + (k1y + 2 * k2y + 2 * k3y + k4y) * dt / 6
  23.     z_new = z + (k1z + 2 * k2z + 2 * k3z + k4z) * dt / 6
  24.     return x_new, y_new, z_new
  25.  
  26. def solve(a, b, c, x0, y0, z0, dt, num_steps):
  27.     x_values = [x0]
  28.     y_values = [y0]
  29.     z_values = [z0]
  30.     for _ in range(num_steps):
  31.         x, y, z = x_values[-1], y_values[-1], z_values[-1]
  32.         x_new, y_new, z_new = runge_kutta(x, y, z, a, b, c, dt)
  33.         x_values.append(x_new)
  34.         y_values.append(y_new)
  35.         z_values.append(z_new)
  36.     return x_values, y_values, z_values
  37.  
  38. x0 = -1
  39. y0 = -1
  40. z0 = 1
  41.  
  42. a = 0.2
  43. b = 0.2
  44. c = 14
  45.  
  46. dt = 0.01
  47. num_steps = 100000
  48.  
  49.  
  50.  
  51. # Розв'язання системи Реслера
  52. x_values, y_values, z_values = solve(a, b, c, x0, y0, z0, dt, num_steps)
  53.  
  54. # Побудова тривимірного графіка
  55. fig = plt.figure(figsize=(12, 10))
  56. ax = fig.add_subplot(221, projection='3d')
  57. ax.plot(x_values, y_values, z_values, '-', linewidth=0.5)
  58. ax.set_xlabel(r'$x$')
  59. ax.set_ylabel(r'$y$')
  60. ax.set_zlabel(r'$z$')
  61. ax.set_title(r"$Фазовий\ портрет\ системи\ Реслера$")
  62.  
  63. # Графіки x(t), y(t), z(t)
  64. ax_x = fig.add_subplot(222)
  65. ax_x.plot(np.arange(len(x_values)) * dt, x_values, '-', linewidth=0.5)
  66. ax_x.set_xlabel(r'$t$')
  67. ax_x.set_ylabel(r'$x$')
  68. ax_x.set_title(r"$Залежність\ x(t)$")
  69.  
  70. ax_y = fig.add_subplot(223)
  71. ax_y.plot(np.arange(len(y_values)) * dt, y_values, '-', linewidth=0.5)
  72. ax_y.set_xlabel(r'$t$')
  73. ax_y.set_ylabel(r'$y$')
  74. ax_y.set_title(r"$Залежність\ y(t)$")
  75.  
  76. ax_z = fig.add_subplot(224)
  77. ax_z.plot(np.arange(len(z_values)) * dt, z_values, '-', linewidth=0.5)
  78. ax_z.set_xlabel(r'$t$')
  79. ax_z.set_ylabel(r'$z$')
  80. ax_z.set_title(r"$Залежність\ z(t)$")
  81.  
  82. plt.tight_layout()
  83. plt.show()
  84.  
  85.  
  86. def ressler(t, y, a, b, c):
  87.     dydt = [
  88.         -y[1] - y[2],
  89.         y[0] + a * y[1],
  90.         b + y[2] * (y[0] - c)
  91.     ]
  92.     return dydt
  93.  
  94. def lyapunov(a, b, c, p=0.5, duration=200, delta_t=0.01, num_iterations=10):
  95.     np.random.seed(0)  # Для відтворюваності результатів
  96.     y0 = np.random.rand(3) * 20 - 10  # Випадкові початкові умови
  97.  
  98.     L_sum = 0
  99.     t_span = [0, duration]
  100.     t_eval = np.arange(0, duration, delta_t)
  101.  
  102.     for _ in range(num_iterations):
  103.         y = y0
  104.         L = 0
  105.  
  106.         sol = solve_ivp(ressler, t_span, y, args=(a, b, c), t_eval=t_eval)
  107.  
  108.         for i in range(len(sol.t) - 1):
  109.             t0, t1 = sol.t[i], sol.t[i + 1]
  110.             y0, y1 = sol.y[:, i], sol.y[:, i + 1]
  111.  
  112.             # Розв'язуємо систему з невеликим зсувом
  113.             y0_perturbed = y0 + p * np.random.rand(3)
  114.             sol_perturbed = solve_ivp(ressler, [t0, t1], y0_perturbed, args=(a, b, c))
  115.             y1_perturbed = sol_perturbed.y[:, -1]
  116.  
  117.             # Обчислення ляпуновського показника
  118.             delta = np.linalg.norm(y1 - y1_perturbed)
  119.             L += np.log(delta / p)
  120.  
  121.         L_sum += L / duration
  122.  
  123.     return L_sum / num_iterations
  124.  
  125. a = 0.3
  126. b = 0.3
  127. c = 28
  128.  
  129. lyap_max = lyapunov(a, b, c)
  130. display(Latex((fr"$Старший\ показник\ Ляпунова\ для\ системи\ Ресслера:\ {lyap_max}$"))
  131.  
  132.        
  133.        
  134.        
  135.        
  136.        
  137.        
  138.        
  139.  
  140.  
  141.  
  142.  
  143. a_range = np.linspace(0.2, 0.3, 100)
  144. c_range = np.linspace(20, 45, 100)
  145.  
  146. lyap_values = np.zeros((len(a_range), len(c_range)))
  147.  
  148. start_time = time.time()
  149.  
  150. idx, values = [], []
  151. for i, a in enumerate(a_range):
  152.     for j, c in enumerate(c_range):
  153.         idx.append((i, j))
  154.         values.append([a, a, c])
  155.  
  156. results = Parallel(n_jobs=-1)(
  157.             delayed(lyapunov)(
  158.                 values[i][0], values[i][1], values[i][2], delta_t=5, index=i) for i in range(len(idx)))
  159.  
  160. for i in range(len(results)):
  161.     lyap_values[idx[results[i][0]]] = results[i][1]
  162.    
  163.    
  164. end_time = time.time()
  165. my_time = end_time - start_time
  166.    
  167. plt.figure(figsize=(10, 6))
  168. plt.imshow(lyap_values, extent=[c_range[0], c_range[-1], a_range[0], a_range[-1]], aspect='auto', cmap='jet')
  169. plt.colorbar(label=r'$Старший\ показник\ Ляпунова$')
  170. plt.xlabel(r'$Параметр\ c$')
  171. plt.ylabel(r'$Параметр\ a$')
  172. plt.title(r'$Карта\ старших\ показників\ Ляпунова\ для\ системи\ Ресслера$')
  173. plt.show()
  174.  
  175. display(Latex(fr'$Час\ моделювання: \quad {my_time_(round(my_time))}.$'))
  176.        
  177.        
  178.        
  179.        
  180.  
  181.        
  182.        
  183.        
  184.        
  185.  
  186.  
  187.  
  188. a_values = [0.2, 0.2, 0.24, 0.29, 0.26, 0.3]
  189. b_values = [0.2, 0.2, 0.24, 0.29, 0.26, 0.3]
  190. c_values = [30, 43, 35, 32, 26, 27]
  191.  
  192. dt = 0.01
  193. num_steps = 5000
  194.  
  195. fig = plt.figure(figsize=(18, 15))
  196.  
  197. for i in range(len(a_values)):
  198.     a = a_values[i]
  199.     b = b_values[i]
  200.     c = c_values[i]
  201.    
  202.     x0 = -1
  203.     y0 = -1
  204.     z0 = 1
  205.  
  206.     x_values, y_values, z_values = solve(a, b, c, x0, y0, z0, dt, num_steps)
  207.  
  208.     ax = fig.add_subplot(3, 3, i + 1, projection='3d')
  209.     ax.plot(x_values, y_values, z_values, 'r-', linewidth=0.5)
  210.     ax.set_xlabel(r'$x$')
  211.     ax.set_ylabel(r'$y$')
  212.     ax.set_zlabel(r'$z$')
  213.     ax.set_title(fr"$a={a},\ b={b},\ c={c}$")
  214.  
  215. plt.tight_layout()
  216. plt.show()
  217.        
  218.        
  219.        
  220.        
  221.        
  222.        
  223.        
  224.        
  225.        
  226. # Знаходження комбінацій параметрів з найвищим, найнижчим і середнім значенням ляпуновського показника
  227. max_idx = np.unravel_index(np.argmax(lyap_values), lyap_values.shape)
  228. min_idx = np.unravel_index(np.argmin(lyap_values), lyap_values.shape)
  229. mean_idx = np.unravel_index(np.nanargmin(np.abs(lyap_values - np.nanmean(lyap_values))), lyap_values.shape)
  230.  
  231. max_a, max_c = a_range[max_idx[0]], c_range[max_idx[1]]
  232. min_a, min_c = a_range[min_idx[0]], c_range[min_idx[1]]
  233. mean_a, mean_c = a_range[mean_idx[0]], c_range[mean_idx[1]]
  234.  
  235.  
  236. display(Latex(fr'$Combination\ with\ highest\ Lyapunov\ exponent:\ {max_a}\quad {max_c}\quad {np.max(lyap_values)}$'))
  237. display(Latex(fr"$Combination\ with\ lowest\ Lyapunov\ exponent:\ {min_a}\quad {min_c}\quad {np.min(lyap_values)}$"))
  238. display(Latex(fr"$Combination\ with\ mean\ Lyapunov\ exponent:\ {mean_a}\quad {mean_c}\quad {np.mean(lyap_values)}$"))
  239.  
  240.  
  241. def plot_3d_phase_portrait(a, b, c, ax):
  242.     y0 = np.random.rand(3) * 20 - 10  # Випадкові початкові умови
  243.     sol = solve_ivp(ressler, [0, 200], y0, args=(a, b, c), dense_output=True)
  244.     t = np.linspace(0, 200, 10000)
  245.     y = sol.sol(t)
  246.     ax.plot(y[0], y[1], y[2], label=fr'$a={round(a, 6)},\ c={round(c, 6)}$')
  247.     ax.set_xlabel(fr'$x$')
  248.     ax.set_ylabel(fr'$y$')
  249.     ax.set_zlabel(fr'$z$')
  250.     ax.legend()
  251.  
  252.  
  253. # Побудова 3D фазових портретів для комбінацій параметрів з найвищим, найнижчим і середнім значенням ляпуновського показника
  254. fig = plt.figure(figsize=(15, 5))
  255.  
  256. ax1 = fig.add_subplot(131, projection='3d')
  257. plot_3d_phase_portrait(max_a, max_a, max_c, ax1)
  258. ax1.set_title(fr'$Highest\ Lyapunov\ Exponent$')
  259.  
  260. ax2 = fig.add_subplot(132, projection='3d')
  261. plot_3d_phase_portrait(min_a, min_a, min_c, ax2)
  262. ax2.set_title(fr'$Lowest\ Lyapunov\ Exponent$')
  263.  
  264. ax3 = fig.add_subplot(133, projection='3d')
  265. plot_3d_phase_portrait(mean_a, mean_a, mean_c, ax3)
  266. ax3.set_title(fr'$Mean\ Lyapunov\ Exponent$')
  267.  
  268. plt.tight_layout()
  269. plt.show()
  270.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement