Advertisement
mirosh111000

Завдання 1

May 31st, 2023
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.67 KB | None | 0 0
  1. import numpy as np
  2. import pandas as pd
  3. import matplotlib.gridspec as gridspec
  4. import matplotlib.pyplot as plt
  5.  
  6. def dx_dt(x, y):
  7.     return k0 - k1 * x * y
  8.  
  9. def dy_dt(x, y):
  10.     return k1 * x * y - k2 * y
  11.  
  12.  
  13. def runge_kute_system(x, y, h, a, b):
  14.     X = [x]
  15.     Y = [y]
  16.     X_Y = []
  17.  
  18.     # print(f'h = {h}')
  19.     t = a
  20.     # print(f't = {t}  |  x = {x}  |  y = {y}')
  21.     while round(t, 3) <= b:
  22.         t = t + h
  23.  
  24.         k1 = h * dx_dt(x, y)
  25.         k2 = h * dx_dt(x + h / 2, y + k1 / 2)
  26.         k3 = h * dx_dt(x + h / 2, y + k2 / 2)
  27.         k4 = h * dx_dt(x + h, y + k3)
  28.         dx = (k1 + 2 * k2 + 2 * k3 + k4) / 6
  29.         x += dx
  30.         X.append(x)
  31.  
  32.         r1 = h * dy_dt(x, y)
  33.         r2 = h * dy_dt(x + h / 2, y + k1 / 2)
  34.         r3 = h * dy_dt(x + h / 2, y + k2 / 2)
  35.         r4 = h * dy_dt(x + h, y + k3)
  36.         dy = (r1 + 2 * r2 + 2 * r3 + r4) / 6
  37.         y += dy
  38.         Y.append(y)
  39.  
  40.         # print(f't = {t:.3f}  |  x = {x:.3f}  |  y = {y:.3f}')
  41.  
  42.     X_Y.append(X)
  43.     X_Y.append(Y)
  44.  
  45.     # print('\n------------------------------------------------------------\n')
  46.     return X_Y
  47.  
  48.  
  49. def grafik(k=3):
  50.     plt.title(f"k0={k0}; k1={k1}; k2={k2}")
  51.     plt.xlabel("x(t)")
  52.     plt.ylabel("y(t)")
  53.     plt.grid()
  54.     lines = []
  55.     labels = []
  56.     for i in dani:
  57.         x_y = runge_kute_system(i[0], i[1], i[2], i[3], i[4])
  58.         line, = plt.plot(x_y[0], x_y[1])
  59.         lines.append(line)
  60.         labels.append(f'x_0={i[0]}; y_0={i[1]}; h={i[2]}')
  61.     plt.legend(lines, labels, loc='center left', bbox_to_anchor=(1, 0.5))
  62.     plt.show()
  63.  
  64.     if k == 3:
  65.         plt.title(f"x(t) (k0={k0}; k1={k1}; k2={k2})")
  66.         plt.xlabel("t")
  67.         plt.ylabel("x")
  68.         plt.grid()
  69.         lines = []
  70.         labels = []
  71.         for i in dani:
  72.             x_y = runge_kute_system(i[0], i[1], i[2], i[3], i[4])
  73.             plt.plot(np.arange(a, b+2*h, h), x_y[0], label=f'x(t); x_0={i[0]}; y_0={i[1]}; h={i[2]}')
  74.         plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))
  75.         plt.show()
  76.  
  77.         plt.title(f"y(t) (k0={k0}; k1={k1}; k2={k2})")
  78.         plt.xlabel("t")
  79.         plt.ylabel("y")
  80.         plt.grid()
  81.         lines = []
  82.         labels = []
  83.         for i in dani:
  84.             x_y = runge_kute_system(i[0], i[1], i[2], i[3], i[4])
  85.             plt.plot(np.arange(a, b + 2 * h, h), x_y[1], label=f'y(t); x_0={i[0]}; y_0={i[1]}; h={i[2]}')
  86.         plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))
  87.         plt.show()
  88.  
  89.  
  90.  
  91. def info():
  92.  
  93.     A = np.array([[-(k1 * k0) / k2, -k2],
  94.                   [(k1 * k0) / k2, 0]])
  95.     B = np.array([k2/k1, k0/k2])
  96.     stat_point = np.array([k2/k1, k0/k2])
  97.     print(f"Стаціонарна точка: ({stat_point[0]}, {stat_point[1]})")
  98.     eigenvalues, eigenvectors = np.linalg.eig(A)
  99.     print("lambda: ", eigenvalues)
  100.  
  101.     if eigenvalues[0] != eigenvalues[1] and np.iscomplexobj(eigenvalues[0]) == False:
  102.  
  103.         if (eigenvalues[0] < 0) and (eigenvalues[1] < 0):
  104.             print(f'Харкатер точки спокою: стійкий вузол ; Стійкість точки спокою: асимптотично стійка.')
  105.  
  106.         if (eigenvalues[0] > 0) and (eigenvalues[1] > 0):
  107.             print(f'Харкатер точки спокою: нестійкий вузол ; Стійкість точки спокою: нестійка.')
  108.  
  109.         if (eigenvalues[0] > 0 and eigenvalues[1] < 0) or (eigenvalues[0] < 0 and eigenvalues[1] > 0):
  110.             print(f'Харкатер точки спокою: сідло ; Стійкість точки спокою: нестійка.')
  111.  
  112.     elif np.iscomplexobj(eigenvalues[0]) == True:
  113.  
  114.         if (eigenvalues[0] < 0) and (eigenvalues[1] < 0):
  115.             print(f'Харкатер точки спокою: стійкий фокус ; Стійкість точки спокою: асимптотично стійка.')
  116.  
  117.         if (eigenvalues[0] > 0) and (eigenvalues[1] > 0):
  118.             print(f'Харкатер точки спокою: нестійкий фокус ; Стійкість точки спокою: нестійка.')
  119.  
  120.         if (eigenvalues[0] > 0 and eigenvalues[1] < 0) or (eigenvalues[0] < 0 and eigenvalues[1] > 0):
  121.             print(f'Харкатер точки спокою: центр ; Стійкість точки спокою: стійка.')
  122.  
  123.     else:
  124.         if (eigenvalues[0] < 0) and (eigenvalues[1] < 0):
  125.             print(f'Харкатер точки спокою: стійкий вузол ; Стійкість точки спокою: асимптотично стійка.')
  126.  
  127.         else:
  128.             print(f'Харкатер точки спокою: нестійкий вузол ; Стійкість точки спокою: нестійка.')
  129.  
  130.     if (4 * k2 ** 2) > (k1 * k0):
  131.         print('4*k2^2 > k1*k0, підкореневий вираз від’ємний, а особова точка – фокус.')
  132.     else:
  133.         print('4*k2^2 < k1*k0, особова точка – вузол.')
  134.     return stat_point
  135.  
  136. def final_grafik():
  137.     global k0
  138.     global k1
  139.     global k2
  140.     k0 = 2
  141.     k1 = 10
  142.     k2 = 2
  143.     fig = plt.figure(figsize=(12, 6))
  144.     gs = gridspec.GridSpec(2, 2, width_ratios=[3, 1], height_ratios=[2, 1])
  145.  
  146.     ax_main = plt.subplot(gs[:, 0])
  147.     ax_main.set_title(f"Дiаграма параметрiв для двох областей")
  148.     ax_main.set_xlabel("k_2")
  149.     ax_main.set_ylabel("k_1 * k_0")
  150.     ax_main.grid()
  151.     ax_main.plot(k_2, 4 * k_2 ** 2, label='k_0 * k_1 = 4k^2')
  152.     ax_main.legend()
  153.  
  154.     ax_small1 = plt.subplot(gs[0, 1])
  155.     ax_small1.set_title("k_0 * k_1 > 4*k^2")
  156.     ax_small1.set_xlabel("x(t)")
  157.     ax_small1.set_ylabel("y(t)")
  158.     for i in dani:
  159.         x_y = runge_kute_system(i[0], i[1], i[2], i[3], i[4])
  160.         ax_small1.plot(x_y[0], x_y[1])
  161.     ax_small1.grid()
  162.  
  163.  
  164.     k0 = 2
  165.     k1 = 10
  166.     k2 = 10
  167.     ax_small2 = plt.subplot(gs[1, 1])
  168.     ax_small2.set_title("k_0 * k_1 < 4*k^2")
  169.     ax_small2.set_xlabel("x(t)")
  170.     ax_small2.set_ylabel("y(t)")
  171.     ax_small2.grid()
  172.     for i in dani:
  173.         x_y = runge_kute_system(i[0], i[1], i[2], i[3], i[4])
  174.         ax_small2.plot(x_y[0], x_y[1])
  175.  
  176.     plt.tight_layout()
  177.     plt.show()
  178.  
  179.  
  180. k0 = 2
  181. k1 = 10
  182. k2 = 2
  183.  
  184. h = 0.001
  185. a = 0
  186. b = 5
  187.  
  188. point = info()
  189. dani = [[0.01, 2.0, h, a, b],
  190.         [0.01, 0.01, h, a, b],
  191.         [1.2, 1.0, h, a, b],
  192.         [0.01, 0.5, h, a, b],
  193.         [0.01, 1.0, h, a, b],
  194.         [1.2, 0.6, h, a, b],
  195.         [0.01, 1.5, h, a, b],
  196.         [0.01, 0.2, h, a, b],
  197.         [0.0, 0.0, h, a, b]]
  198.  
  199.  
  200. grafik()
  201.  
  202. k0 = 2
  203. k1 = 10
  204. k2 = 10
  205.  
  206. point = info()
  207. grafik()
  208.  
  209.  
  210. k_2 = np.linspace(0, 10, 20)
  211. k_1 = np.linspace(0, 10, 20)
  212.  
  213. final_grafik()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement