mirosh111000

Мірошниченко_ГЙМ_ПР№11-13

Dec 17th, 2025
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.62 KB | None | 0 0
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from scipy.integrate import cumulative_trapezoid, trapezoid
  4.  
  5. TAU = 1.5
  6. ZETA_E = 0.0
  7. I_S_ADDITIVE = 0.0
  8.  
  9. CURVES_PARAMS = [
  10.     {"label": "1: SOC (I_sigma=0, I_zeta=30)",    "I_sigma": 0.0, "I_zeta": 30.0, "style": "k-",  "marker": None},
  11.     {"label": "2: A+N (I_sigma=0.5, I_zeta=30)",  "I_sigma": 0.5, "I_zeta": 30.0, "style": "r-",  "marker": "o"},
  12.     {"label": "3: N (I_sigma=1, I_zeta=5)",       "I_sigma": 1.0, "I_zeta": 5.0,  "style": "g--", "marker": "^"},
  13.     {"label": "4: A (I_sigma=2, I_zeta=0.5)",     "I_sigma": 2.0, "I_zeta": 0.5,  "style": "b-.", "marker": "s"}
  14. ]
  15.  
  16. S_MIN_LOG = -4
  17. S_MAX_LOG = 0
  18. POINTS = 2000
  19.  
  20. def d_tau(s):
  21.     s = np.abs(s)
  22.     return (1 + s**TAU)**(-1)
  23.  
  24. def func_f(s):
  25.     term2 = ZETA_E * (np.abs(s)**(TAU/2)) * d_tau(s)
  26.     return -s + term2
  27.  
  28. def func_I(s, I_sigma, I_zeta):
  29.     s = np.abs(s)
  30.     dt = d_tau(s)
  31.     term_brackets = I_sigma + I_zeta * (s**TAU)
  32.     return I_S_ADDITIVE + term_brackets * (dt**2)
  33.  
  34. plt.figure(figsize=(10, 8))
  35.  
  36. s_values = np.logspace(S_MIN_LOG, S_MAX_LOG, POINTS)
  37. s_calc = np.insert(s_values, 0, 0.0)
  38.  
  39. for params in CURVES_PARAMS:
  40.     I_sigma = params["I_sigma"]
  41.     I_zeta = params["I_zeta"]
  42.    
  43.     I_vals = func_I(s_calc, I_sigma, I_zeta)
  44.    
  45.     with np.errstate(divide='ignore', invalid='ignore'):
  46.         G_calc = func_f(s_calc) / I_vals
  47.    
  48.     if np.isinf(G_calc[0]) or np.isnan(G_calc[0]):
  49.         G_calc[0] = 0
  50.        
  51.     integral_values = cumulative_trapezoid(G_calc, s_calc, initial=0)
  52.     integral_res = integral_values[1:]
  53.  
  54.     I_vals_res = func_I(s_values, I_sigma, I_zeta)
  55.     P_raw = (1.0 / I_vals_res) * np.exp(integral_res)
  56.    
  57.     norm_const_Z = trapezoid(P_raw, s_values)
  58.     P_normalized = P_raw / norm_const_Z
  59.    
  60.     plt.plot(s_values, P_normalized, params["style"], label=params["label"],
  61.              linewidth=2, marker=params["marker"], markevery=150, markersize=8)
  62.  
  63. plt.xscale('log')
  64. plt.yscale('log')
  65. plt.xlim(1e-4, 1e0)
  66. plt.ylim(1e-3, 1e4)
  67. plt.xlabel('Розмір лавини, s', fontsize=12)
  68. plt.ylabel('Функція розподілу, P(s)', fontsize=12)
  69. plt.title('Функції розподілу', fontsize=14)
  70. plt.legend(loc="best")
  71. plt.grid(True, which="both", ls="-", alpha=0.4)
  72. plt.tight_layout()
  73.  
  74.  
  75. DT = 0.01
  76. STEPS = 5000
  77. times = np.arange(STEPS) * DT
  78.  
  79. fig, axes = plt.subplots(2, 2, figsize=(14, 10))
  80. axes = axes.flatten()
  81.  
  82. np.random.seed(42)
  83.  
  84. for i, params in enumerate(CURVES_PARAMS):
  85.     ax = axes[i]
  86.     I_sigma = params["I_sigma"]
  87.     I_zeta = params["I_zeta"]
  88.     label = params["label"]
  89.    
  90.     s_t = np.zeros(STEPS)
  91.     s_t[0] = 0.1
  92.    
  93.     for t in range(STEPS - 1):
  94.         s_curr = s_t[t]
  95.        
  96.         I_val = func_I(s_curr, I_sigma, I_zeta)
  97.         f_val = func_f(s_curr)
  98.        
  99.         drift = f_val * DT
  100.         diffusion = np.sqrt(2 * I_val * DT) * np.random.normal(0, 1)
  101.        
  102.         s_next = s_curr + drift + diffusion
  103.        
  104.         if s_next < 1e-6:
  105.             s_next = 1e-6
  106.            
  107.         s_t[t+1] = s_next
  108.    
  109.     color = params["style"][0]
  110.     if color == 'k': color = 'black'
  111.     elif color == 'r': color = 'red'
  112.     elif color == 'g': color = 'green'
  113.     elif color == 'b': color = 'blue'
  114.        
  115.     ax.plot(times, s_t, color=color, linewidth=0.8)
  116.     ax.set_title(f"Варіант {label}", fontsize=10)
  117.     ax.set_xlabel("Час, t")
  118.     ax.set_ylabel("s(t)")
  119.     ax.grid(True, alpha=0.3)
  120.     ax.set_ylim(bottom=0)
  121.  
  122. plt.suptitle("Часові ряди стохастичної змінної", fontsize=16)
  123. plt.tight_layout(rect=[0, 0.03, 1, 0.95])
  124. plt.show()
  125.  
Advertisement
Add Comment
Please, Sign In to add comment