mirosh111000

Мірошниченко_КМЗПМ_ЛР№1

Oct 7th, 2025 (edited)
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.62 KB | None | 0 0
  1. from dataclasses import dataclass
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4.  
  5. @dataclass
  6. class TimeGrid:
  7.     t_min: float = 1e-3  
  8.     t_max: float = 1e4
  9.     dt: float = 0.002  
  10.  
  11.     def values(self) -> np.ndarray:
  12.         span = self.t_max - self.t_min
  13.         num = int(np.floor(span / self.dt)) + 1
  14.         return np.logspace(np.log10(self.t_min), np.log10(self.t_max), num)
  15.  
  16. def msd_free_times(D: float, N: int, t: np.ndarray, seed: int | None = 0):
  17.     rng = np.random.default_rng(seed)
  18.     x = np.zeros(N)
  19.     msd = np.zeros_like(t)
  20.     t_prev = 0.0
  21.     for k, tk in enumerate(t):
  22.         dt = tk - t_prev
  23.         x += np.sqrt(D * dt) * rng.standard_normal(N)
  24.         msd[k] = np.mean(x * x) - np.mean(x) ** 2
  25.         t_prev = tk
  26.     return t, msd
  27.  
  28.  
  29. @dataclass
  30. class CompositeParams:
  31.     D: float = 1.0
  32.     gamma0: float = 1.0
  33.     gamma: float = 1.0
  34.     k: float = 1.0
  35.     M: int = 0
  36.     N: int = 1000
  37.     seed: int | None = 0
  38.  
  39.  
  40. def msd_composite_times(params: CompositeParams, t: np.ndarray):
  41.     rng = np.random.default_rng(params.seed)
  42.     N, M = params.N, params.M
  43.     x = np.zeros(N)
  44.     sat = np.zeros((N, M)) if M > 0 else np.zeros((N, 0))
  45.     msd = np.zeros_like(t)
  46.     t_prev = 0.0
  47.     for k, tk in enumerate(t):
  48.         dt = tk - t_prev
  49.         if M > 0:
  50.             diff = x[:, None] - sat
  51.             force_on_x = -params.k * np.sum(diff, axis=1)
  52.             x += (dt / params.gamma0) * force_on_x + (np.sqrt(params.D * dt) / params.gamma0) * rng.standard_normal(N)
  53.             sat += (dt / params.gamma) * (params.k * diff) + (np.sqrt(params.D * dt) / params.gamma) * rng.standard_normal((N, M))
  54.         else:
  55.             x += (np.sqrt(params.D * dt) / params.gamma0) * rng.standard_normal(N)
  56.         msd[k] = np.mean(x * x) - np.mean(x) ** 2
  57.         t_prev = tk
  58.     return t, msd
  59.  
  60.  
  61. def style_log_axes(ax: plt.Axes, xlabel: str = "time", ylabel: str = r"⟨(δx)²⟩") -> None:
  62.     ax.set_xscale("log")
  63.     ax.set_yscale("log")
  64.     ax.set_xlabel(xlabel)
  65.     ax.set_ylabel(ylabel)
  66.     ax.grid(True, which="both", ls=":", lw=0.7, alpha=0.6)
  67.     ax.set_xlim(1e-3, 1e4)
  68.     ax.set_ylim(1e-4, 1e4)
  69.  
  70.  
  71. def show_fig37() -> None:
  72.     grid = TimeGrid(dt=0.002)
  73.     t_line = grid.values()
  74.     t1, msd1 = msd_free_times(D=0.1, N=200, t=t_line, seed=1)
  75.     _, msd2 = msd_free_times(D=1.0, N=200, t=t_line, seed=2)
  76.     idx = np.linspace(0, len(t_line) - 1, 60).astype(int)
  77.     t_mark = t_line[idx]
  78.     msd1_mark = msd1[idx]
  79.     msd2_mark = msd2[idx]
  80.     fig, ax = plt.subplots(figsize=(8, 6), dpi=140)
  81.     style_log_axes(ax)
  82.  
  83.     ax.plot(t_line, msd1, '-', lw=1.5, color='royalblue', label='D = 0.1')
  84.     ax.plot(t_line, msd2, '-', lw=1.5, color='red', label='D = 1.0')
  85.  
  86.     ax.plot(t_mark, msd1_mark, 'o', ms=3, color='royalblue')
  87.     ax.plot(t_mark, msd2_mark, 'o', ms=3, color='red')
  88.  
  89.     tt = np.logspace(-3, 4, 50)
  90.     ax.plot(tt, tt, color='0.3', lw=1.0)
  91.     ax.plot(tt, 0.1 * tt, color='0.3', lw=1.0)
  92.     ax.text(3, 2, 't', fontsize=9)
  93.     ax.text(3, 0.2, '0.1t', fontsize=9)
  94.     ax.legend(frameon=False, loc='upper left')
  95.     ax.set_title('Середньоквадратичне зміщення: вільна частинка')
  96.     plt.tight_layout()
  97.     plt.show()
  98.  
  99. def show_fig() -> None:
  100.     grid = TimeGrid(dt=0.002)
  101.     base = CompositeParams(D=1.0, gamma0=1.0, gamma=1.0, k=1.0, N=1000)
  102.     p0 = CompositeParams(**{**base.__dict__, 'M': 0, 'seed': 3})
  103.     p10 = CompositeParams(**{**base.__dict__, 'M': 2, 'seed': 4})
  104.     t_line = grid.values()
  105.     t0, msd0 = msd_composite_times(p0, t_line)
  106.     _, msd10 = msd_composite_times(p10, t_line)
  107.     idx = np.linspace(0, len(t_line) - 1, 60).astype(int)
  108.     t_mark = t_line[idx]
  109.     msd0_mark = msd0[idx]
  110.     msd10_mark = msd10[idx]
  111.     fig, ax = plt.subplots(figsize=(8, 6), dpi=140)
  112.     style_log_axes(ax)
  113.  
  114.     ax.plot(t_line, msd0, '-', lw=1.5, color='crimson', label='M = 0, N = 1000')
  115.     ax.plot(t_line, msd10, '-', lw=1.5, color='darkgreen', label='M = 2, N = 1000')
  116.  
  117.     ax.scatter(t_mark, msd0_mark, s=5, color='crimson')
  118.     ax.scatter(t_mark, msd10_mark, s=5,color='darkgreen')
  119.     tt = np.logspace(-3, 4, 50)
  120.     ax.plot(tt, tt, color='0.3', lw=1.0)
  121.     ax.set_title('MSD композитної частинки')
  122.     ax.legend(frameon=False, loc='upper left', title='$\\gamma_0 = 1$\n$\\gamma = 1$\n$k = 1$')
  123.     plt.tight_layout()
  124.     plt.show()
  125.  
  126.  
  127. def show_fig41() -> None:
  128.     grid = TimeGrid(dt=0.002)
  129.     base = CompositeParams(D=25.0, gamma0=5.0, gamma=1.0, k=1.0, N=1000)
  130.     p0 = CompositeParams(**{**base.__dict__, 'M': 0, 'seed': 3})
  131.     p10 = CompositeParams(**{**base.__dict__, 'M': 10, 'seed': 4})
  132.     t_line = grid.values()
  133.     t0, msd0 = msd_composite_times(p0, t_line)
  134.     _, msd10 = msd_composite_times(p10, t_line)
  135.     idx = np.linspace(0, len(t_line) - 1, 60).astype(int)
  136.     t_mark = t_line[idx]
  137.     msd0_mark = msd0[idx]
  138.     msd10_mark = msd10[idx]
  139.     fig, ax = plt.subplots(figsize=(8, 6), dpi=140)
  140.     style_log_axes(ax)
  141.  
  142.     ax.plot(t_line, msd0, '-', lw=1.5, color='crimson', label='M = 0, N = 1000')
  143.     ax.plot(t_line, msd10, '-', lw=1.5, color='darkgreen', label='M = 10, N = 1000')
  144.  
  145.     ax.scatter(t_mark, msd0_mark, s=5, color='crimson')
  146.     ax.scatter(t_mark, msd10_mark, s=5,color='darkgreen')
  147.     tt = np.logspace(-3, 4, 50)
  148.     ax.plot(tt, tt, color='0.3', lw=1.0)
  149.     ax.set_title('MSD композитної частинки')
  150.     ax.legend(frameon=False, loc='upper left', title='$\\gamma_0 = 5$\n$\\gamma = 1$\n$k = 1$')
  151.     plt.tight_layout()
  152.     plt.show()
  153.  
  154.  
  155. def main() -> None:
  156.     show_fig37()
  157.     show_fig()
  158.     show_fig41()
  159.  
  160.  
  161. if __name__ == "__main__":
  162.     main()
  163.  
Advertisement
Add Comment
Please, Sign In to add comment