Advertisement
myloyo

№8 Метод Эйлера решения задачи Коши для обыкновенного дифференциального уравнения (ОДУ) 1-го порядка

Dec 12th, 2024
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.72 KB | None | 0 0
  1. import math
  2.  
  3. eps = 1e-6
  4. V = 8
  5.  
  6.  
  7. def f(x, y):
  8.     return 3 * x * x - 2 * V * x
  9.  
  10.  
  11. def check_y(x):
  12.     return x*x*(x - V)
  13.  
  14.  
  15. def euler(n, h, x0, y0):
  16.     x = [0] * n
  17.     x[0] = x0
  18.     for i in range(n - 1):
  19.         x[i + 1] = x[i] + h
  20.     y = [0] * n
  21.     y[0] = y0
  22.     for i in range(n - 1):
  23.         y[i + 1] = y[i] + h * f(x[i], y[i])
  24.     return y
  25.  
  26.  
  27. def ex_euler(n, h, x0, y0):
  28.     x = [0] * (2 * n)
  29.     x[0] = x0
  30.     for i in range(2 * n - 1):
  31.         x[i + 1] = x[i] + h / 2
  32.     y = [0] * (2 * n)
  33.     y[0] = y0
  34.     for i in range(2 * n - 1):
  35.         if i % 2:
  36.             y[i + 1] = y[i - 1] + h * f(x[i], y[i])
  37.         else:
  38.             y[i + 1] = y[i] + h / 2 * f(x[i], y[i])
  39.     res = [0] * n
  40.     for i in range(n):
  41.         res[i] = y[2 * i]
  42.     return res
  43.  
  44.  
  45. def print_result(vx, vy):
  46.     for x in vx:
  47.         print(f"{x:.2f}", end="\t")
  48.     print()
  49.     for x in vy:
  50.         print(f"{x:.2f}", end="\t")
  51.     print()
  52.     for x in vx:
  53.         print(f"{check_y(x):.2f}", end="\t")
  54.     print()
  55.     for i in range(len(vy)):
  56.         print(f"{vy[i] - check_y(vx[i]):.2f}", end="\t")
  57.     print()
  58.     mx = 0
  59.     for i in range(len(vy)):
  60.         mx = max(mx, abs(vy[i] - check_y(vx[i])))
  61.     print(f"Максимальное отклонение: {mx:.5f}")
  62.  
  63.  
  64. def solve():
  65.     n = 13
  66.     h = 1e-0
  67.     x0 = 1
  68.     y0 = 0
  69.     vx = [0] * n
  70.     vx[0] = x0
  71.     for i in range(1, n):
  72.         vx[i] = vx[i - 1] + h
  73.  
  74.     print("Метод Эйлера:")
  75.     vy1 = euler(n, h, x0, y0)
  76.     print_result(vx, vy1)
  77.     print()
  78.  
  79.     print("Расширенный метод Эйлера:")
  80.     vy2 = ex_euler(n, h, x0, y0)
  81.     print_result(vx, vy2)
  82.     print()
  83.  
  84.  
  85. if __name__ == "__main__":
  86.     solve()
  87.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement