import math
from prettytable import PrettyTable
a = -2
b = -1
# Перевод числа в строку
def toFixed(numObj, digits=0):
return f"{numObj:.{digits}f}"
# Правая часть дифференциального уравнения:
# y' = x^3 * y
def Uravnenie(xx, yy):
return xx**3 * yy
# Точное решение задачи Коши:
# y(0) = 1
# y = e^(x^4 / 4)
def ExactSolution(x):
return math.exp(x**4 / 4)
def Diffur(n):
mytable = PrettyTable()
mytable.title = f"Приближённое решение диф. уравнения при n = {n}"
mytable.field_names = [
"i", "xi", "y(xi)",
"yi(Э)", "|y(xi)-yi(Э)|",
"yi(Р-К)", "|y(xi)-yi(Р-К)|",
"yi(А)", "|y(xi)-yi(А)|"
]
data = []
h = (b - a) / n
# Начальные условия
x = [a]
yk = [1.0] # точное решение
ye = [1.0] # метод Эйлера
yr = [1.0] # метод Рунге-Кутты 4-го порядка
ya = [1.0] # метод Адамса 4-го порядка
# Начальная строка
data.append([
0,
toFixed(x[0], 4),
toFixed(yk[0], 9),
toFixed(ye[0], 9),
toFixed(abs(yk[0] - ye[0]), 9),
toFixed(yr[0], 9),
toFixed(abs(yk[0] - yr[0]), 9),
toFixed(ya[0], 9),
toFixed(abs(yk[0] - ya[0]), 9)
])
for i in range(n):
# Следующее значение x
xi = x[i] + h
x.append(xi)
# Точное решение
exact = ExactSolution(xi)
yk.append(exact)
# Метод Эйлера
ye_next = ye[i] + h * Uravnenie(x[i], ye[i])
ye.append(ye_next)
# Метод Рунге-Кутты 4-го порядка
k1 = h * Uravnenie(x[i], yr[i])
k2 = h * Uravnenie(x[i] + h / 2, yr[i] + k1 / 2)
k3 = h * Uravnenie(x[i] + h / 2, yr[i] + k2 / 2)
k4 = h * Uravnenie(x[i] + h, yr[i] + k3)
yr_next = yr[i] + (k1 + 2 * k2 + 2 * k3 + k4) / 6
yr.append(yr_next)
# Метод Адамса 4-го порядка
if i < 3:
# Для первых 4 точек используем значения Рунге-Кутты
ya_next = yr_next
else:
ya_next = ya[i] + (h / 24) * (
55 * Uravnenie(x[i], ya[i])
- 59 * Uravnenie(x[i - 1], ya[i - 1])
+ 37 * Uravnenie(x[i - 2], ya[i - 2])
- 9 * Uravnenie(x[i - 3], ya[i - 3])
)
ya.append(ya_next)
# Добавление строки в таблицу
data.append([
i + 1,
toFixed(xi, 4),
toFixed(exact, 9),
toFixed(ye_next, 9),
toFixed(abs(exact - ye_next), 9),
toFixed(yr_next, 9),
toFixed(abs(exact - yr_next), 11),
toFixed(ya_next, 9),
toFixed(abs(exact - ya_next), 11)
])
mytable.add_rows(data)
print(mytable)
# Вывод таблиц для n = 10 и n = 20
Diffur(10)
Diffur(20)