mirosh111000

НПтаМ_ПР№1_Мірошниченко

Mar 14th, 2026
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.36 KB | None | 0 0
  1. import numpy as np, math
  2. import matplotlib.pyplot as plt
  3. import mpmath as mp
  4. from pathlib import Path
  5.  
  6.  
  7.  
  8. k = 1.0
  9. eta_t = 0.5
  10. theta = eta_t**2
  11.  
  12. # ---------- Part 1 ----------
  13. etas = np.linspace(-2.5, 2.5, 600)
  14. Se_vals = [0.8, 1.0, 1.6, 2.5]
  15.  
  16. fig = plt.figure(figsize=(8, 5))
  17. for Se in Se_vals:
  18.     S = Se / (1 + etas**2)
  19.     h = Se * etas / (1 + etas**2)
  20.     plt.plot(etas, S, label=fr'$S(\eta),\ S_e={Se}$')
  21.     plt.plot(etas, h, linestyle='--', label=fr'$h(\eta),\ S_e={Se}$')
  22. plt.axhline(0, linewidth=0.8, color='black')
  23. plt.axvline(0, linewidth=0.8, color='black')
  24. plt.xlabel(r'$\eta$')
  25. plt.ylabel('Значення')
  26. plt.title('Частина 1: залежності $S(\eta)$ та $h(\eta)$')
  27. plt.legend(fontsize=8, ncol=2)
  28. plt.tight_layout()
  29. plt.savefig('part1_dependencies.png', dpi=200)
  30. plt.close(fig)
  31.  
  32. fig = plt.figure(figsize=(8, 5))
  33. for Se in [0.8, 1.0, 1.3, 2.0]:
  34.     V = 0.5 * etas**2 - 0.5 * Se * np.log(1 + etas**2)
  35.     plt.plot(etas, V, label=fr'$S_e={Se}$')
  36. plt.axhline(0, linewidth=0.8, color='black')
  37. plt.axvline(0, linewidth=0.8, color='black')
  38. plt.xlabel(r'$\eta$')
  39. plt.ylabel(r'$V(\eta)$')
  40. plt.title('Частина 1: синергетичний потенціал')
  41. plt.legend()
  42. plt.tight_layout()
  43. plt.savefig('part1_potential.png', dpi=200)
  44. plt.close(fig)
  45.  
  46. Se_grid = np.linspace(0, 3, 601)
  47. eta_pos = np.where(Se_grid >= 1, np.sqrt(Se_grid - 1), np.nan)
  48. eta_neg = np.where(Se_grid >= 1, -np.sqrt(Se_grid - 1), np.nan)
  49. fig = plt.figure(figsize=(8, 5))
  50. plt.plot(Se_grid, np.zeros_like(Se_grid), label=r'$\eta_0=0$')
  51. plt.plot(Se_grid, eta_pos, label=r'$\eta_0=+\sqrt{S_e-1}$')
  52. plt.plot(Se_grid, eta_neg, label=r'$\eta_0=-\sqrt{S_e-1}$')
  53. plt.axvline(1, linestyle='--', color='gray', label=r'$S_c=1$')
  54. plt.xlabel(r'$S_e$')
  55. plt.ylabel(r'$\eta_0$')
  56. plt.title('Частина 1: стаціонарний параметр порядку')
  57. plt.legend()
  58. plt.tight_layout()
  59. plt.savefig('part1_stationary.png', dpi=200)
  60. plt.close(fig)
  61.  
  62. # ---------- Part 2 ----------
  63. def V2(eta, Se):
  64.     return 0.5*eta**2 + 0.5*k*eta_t**2*np.log(1 + (eta/eta_t)**2) - 0.5*Se*np.log(1 + eta**2)
  65.  
  66. def stationary_x_roots(Se):
  67.     B = (1+k)*eta_t**2 + (1-Se)
  68.     C = eta_t**2*(1+k-Se)
  69.     disc = B*B - 4*C
  70.     if disc < -1e-12:
  71.         return []
  72.     disc = max(disc, 0.0)
  73.     roots = [(-B - math.sqrt(disc))/2, (-B + math.sqrt(disc))/2]
  74.     return sorted([float(r) for r in roots if r >= -1e-12])
  75.  
  76. def d2V(eta, Se):
  77.     return 1 + k*(1-(eta/eta_t)**2)/(1+(eta/eta_t)**2)**2 - Se*(1-eta**2)/(1+eta**2)**2
  78.  
  79. Se_plateau = 1 - theta + k*theta + 2*math.sqrt(k*theta*(1-theta))
  80. Se_spinodal0 = 1 + k
  81.  
  82. def coexistence_eq(y):
  83.     Se = (1+y)*(1 + k/(1+y/theta))
  84.     return y + k*theta*mp.log(1+y/theta) - Se*mp.log(1+y)
  85.  
  86. ys = np.linspace(1e-5, 10, 5000)
  87. vals = [float(coexistence_eq(y)) for y in ys]
  88. root_y = None
  89. for i in range(len(ys)-1):
  90.     if vals[i] == 0 or vals[i+1] == 0 or vals[i]*vals[i+1] < 0:
  91.         root_y = float(mp.findroot(lambda z: coexistence_eq(z), (ys[i], ys[i+1])))
  92.         break
  93. Se_coexist = float((1+root_y)*(1 + k/(1+root_y/theta)))
  94.  
  95.  
  96. fig = plt.figure(figsize=(8, 5.3))
  97. for Se, label in [(1.7, r'$S_e<S_e^{pl}$'), (Se_plateau, r'$S_e=S_e^{pl}$'), (Se_coexist, r'$S_e=S_e^*$'), (2.0, r'$S_e=S_e^{(0)}$')]:
  98.     plt.plot(etas, V2(etas, Se), label=label)
  99. plt.axhline(0, linewidth=0.8, color='black')
  100. plt.axvline(0, linewidth=0.8, color='black')
  101. plt.xlabel(r'$\eta$')
  102. plt.ylabel(r'$V(\eta)$')
  103. plt.title('Частина 2: синергетичний потенціал за різних $S_e$')
  104. plt.legend(fontsize=9)
  105. plt.tight_layout()
  106. plt.savefig('part2_potential.png', dpi=200)
  107. plt.close(fig)
  108.  
  109.  
  110. Se_grid = np.linspace(1.4, 2.2, 500)
  111. stable_pos, stable_neg, unstable_pos, unstable_neg = [], [], [], []
  112. for Se in Se_grid:
  113.     roots = stationary_x_roots(Se)
  114.     st_pos = st_neg = un_pos = un_neg = np.nan
  115.     for x in roots:
  116.         if x < 1e-10:
  117.             continue
  118.         eta = math.sqrt(x)
  119.         if d2V(eta, Se) > 0:
  120.             st_pos, st_neg = eta, -eta
  121.         else:
  122.             un_pos, un_neg = eta, -eta
  123.     stable_pos.append(st_pos); stable_neg.append(st_neg)
  124.     unstable_pos.append(un_pos); unstable_neg.append(un_neg)
  125. fig = plt.figure(figsize=(8, 5.3))
  126. zero_stable = np.where(Se_grid <= Se_spinodal0, 0.0, np.nan)
  127. zero_unstable = np.where(Se_grid >= Se_spinodal0, 0.0, np.nan)
  128. plt.plot(Se_grid, zero_stable, label='стійка нульова гілка')
  129. plt.plot(Se_grid, stable_pos, label='стійка ненульова гілка')
  130. plt.plot(Se_grid, stable_neg)
  131. plt.plot(Se_grid, zero_unstable, linestyle='--', label='нестійка нульова гілка')
  132. plt.plot(Se_grid, unstable_pos, linestyle='--', label='нестійка ненульова гілка')
  133. plt.plot(Se_grid, unstable_neg, linestyle='--')
  134. plt.axvline(Se_plateau, linestyle=':', color='gray', label=fr'$S_e^{{pl}}\approx {Se_plateau:.3f}$')
  135. plt.axvline(Se_coexist, linestyle='-.', color='gray', label=fr'$S_e^*\approx {Se_coexist:.3f}$')
  136. plt.axvline(Se_spinodal0, linestyle='--', color='black', label=fr'$S_e^{{(0)}}={Se_spinodal0:.1f}$')
  137. plt.xlabel(r'$S_e$')
  138. plt.ylabel(r'$\eta_0$')
  139. plt.title('Частина 2: стаціонарні стани і область гістерезису')
  140. plt.legend(fontsize=8, ncol=2)
  141. plt.tight_layout()
  142. plt.savefig('part2_stationary.png', dpi=200)
  143. plt.close(fig)
  144.  
  145. print('done', Se_plateau, Se_coexist, Se_spinodal0)
  146.  
Advertisement
Add Comment
Please, Sign In to add comment