Skip to content

Instantly share code, notes, and snippets.

@oleksandr-danylchenko
Last active May 9, 2023 18:19
Show Gist options
  • Save oleksandr-danylchenko/4bdd86c7b7f1d02660db8320b81789df to your computer and use it in GitHub Desktop.
Save oleksandr-danylchenko/4bdd86c7b7f1d02660db8320b81789df to your computer and use it in GitHub Desktop.
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint
# Визначаємо функцію рівняння із умови
def func(y, x):
return (np.sin(2 * x) / (2 - np.sin(x) ** 2) - 2 * y) / 2
# Реалізація методу Ейлера-Коші де крок ітерації визначено як:
# x[i+1] = x[i] + h
def euler_cauchy(func, x0, y0, h, x_end):
x, y = [x0], [y0]
while x[-1] < x_end:
# Модифікований метод Ейлера може забезпечити краще наближення
# y_new = y[-1] + h * func(y[-1] + h / 2 * func(y[-1], x[-1]), x[-1] + h / 2)
y_new = y[-1] + h * func(y[-1], x[-1])
x_new = x[-1] + h
x.append(x_new)
y.append(y_new)
return np.array(x), np.array(y)
# Визначаємо початкові параметри за умовою
x0, y0 = 0, 0
h = np.pi / 40
x_end = np.pi / 4
x_exact = np.linspace(x0, x_end, 1000)
# Розв'язуємо задачу за допомогою методу Ейлера-Коші
x_approx, y_approx = euler_cauchy(func, x0, y0, h, x_end)
# Отримуємо точний розвʼязок задачі за допомогою вбудованого розв'язувача odeint (ODE з англ. Ordinary Differential Equation) або звичайне диференціальне рівняння)
# Він базується на методах Ліндштедта і Булірша-Стоера з допоміжною обробкою. Ці методи є надійними та ефективними для розв'язання широкого спектра задач.
y_exact = odeint(func, y0, x_exact).flatten()
# Побудова графіків точного і наближеного розв'язків
plt.plot(x_exact, y_exact, label='Точний розв’язок')
plt.plot(x_approx, y_approx, 'o-', label='Наближений розв’язок (Ейлер-Коші)')
plt.xlabel('x')
plt.ylabel('y(x)')
plt.legend()
plt.grid()
plt.show()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment