Advertisement
alkkofficial

Untitled

Jun 6th, 2025
333
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.33 KB | None | 0 0
  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. from tqdm import tqdm
  4. def dydx(x):
  5.     return np.cos(x)
  6.  
  7.  
  8. class RK4Solver:
  9.     def __init__(self, x, y, h, num_steps):
  10.         self.x = x
  11.         self.y = y
  12.         self.h = h
  13.         self.num_steps = num_steps
  14.         self.xs = []
  15.         self.ys = []
  16.  
  17.     def solve(self):
  18.         for _ in range(self.num_steps):
  19.             self.x, self.y = self.solve_step()
  20.             self.xs.append(self.x)
  21.             self.ys.append(self.y)
  22.  
  23.     def solve_step(self):
  24.         x0 = self.x
  25.         y0 = self.y
  26.  
  27.         k1 = dydx(x0)
  28.         k2 = dydx(x0 + self.h / 2)
  29.         k3 = dydx(x0 + self.h / 2)
  30.         k4 = dydx(x0 + self.h)
  31.  
  32.         x_new = x0 + self.h
  33.         y_new = y0 + (self.h / 6) * (k1 + 2 * k2 + 2 * k3 + k4)
  34.  
  35.         return x_new, y_new
  36.  
  37.  
  38. class EulerSolver:
  39.     def __init__(self, x, y, h, num_steps):
  40.         self.x = x
  41.         self.y = y
  42.         self.h = h
  43.         self.num_steps = num_steps
  44.         self.xs = []
  45.         self.ys = []
  46.  
  47.     def solve(self):
  48.         for _ in range(self.num_steps):
  49.             self.x, self.y = self.solve_step()
  50.             self.xs.append(self.x)
  51.             self.ys.append(self.y)
  52.  
  53.     def solve_step(self):
  54.         x0 = self.x
  55.         y0 = self.y
  56.  
  57.         x_new = x0 + self.h
  58.         y_new = y0 + self.h * dydx(x0)
  59.  
  60.         return x_new, y_new
  61.  
  62.  
  63. if __name__ == "__main__":
  64.     hs = np.logspace(-3, -1, 100)
  65.     x = 0
  66.     y = 0
  67.     x_end = 100
  68.     errors_rk4 = []
  69.     errors_euler = []
  70.  
  71.     for h in tqdm(hs):
  72.         num_steps = int((x_end - x) / h)
  73.         x_model = x + h * np.arange(1, num_steps + 1)
  74.         y_model = np.sin(x_model)
  75.  
  76.         rk4 = RK4Solver(x, y, h, num_steps)
  77.         euler = EulerSolver(x, y, h, num_steps)
  78.  
  79.         rk4.solve()
  80.         euler.solve()
  81.         rk4_error = np.mean(np.abs(np.array(rk4.ys) - y_model))
  82.         euler_error = np.mean(np.abs(np.array(euler.ys) - y_model))
  83.  
  84.         errors_rk4.append(rk4_error)
  85.         errors_euler.append(euler_error)
  86.  
  87.  
  88.     plt.plot(hs, errors_rk4, label="RK4")
  89.     plt.plot(hs, errors_euler, label="Euler")
  90.     plt.xscale("log")
  91.     plt.yscale("log")
  92.     plt.xlabel("Step Size (h)")
  93.     plt.ylabel("Mean Absolute Error")
  94.     plt.title("Comparison of RK4 and Euler Methods")
  95.     plt.legend()
  96.     plt.grid(True)
  97.     plt.show()
  98.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement