Решение ОДУ на Python
уважаемые форумчане! Есть одна проблема, написал скрипт для решения задачи Коши, методом Эйлера, чтобы можно было строить графики ошибок и вычислять ошибку численного решения, однако, не могу понять, почему возникла такая ошибка:
# Author: Alm99-collab
# Date: 25/11/2021 2:00
# Description: MSUT STANKIN Μyagkov Alexandr IDM - 21 - 03
import numpy as np
import matplotlib.pyplot as plt
import math
# фнукция решатель методом Эйлера (прямая схема)
def euler(func, Y0, b, n):
"""Решение ОДУ u'=f(y,x), начальное условие y(0) = U0 , c n шагами, пока x = b - конец отрезка интегрирования."""
x = np.zeros(n + 1)
y = np.zeros(n + 1)
y[0] = Y0
x[0] = 0
dx = b / float(n)
for k in range(n):
x[k + 1] = x[k] + dx
y[k + 1] = y[k] + dx * func(y[k], x[k])
return y, x
# Сравнение точного аналитического решения и численного
# функция возврата точного решения
def y_exact(x):
return ((x ** 2) / 2) - (x / 2) + 0.75 * math.exp(-2 * x) + 0.25
# Функция постановки задачи: y'= y
def func(y, x):
return x ** 2 - 2 * y
y, x = euler(func, Y0 = y_exact(0), b = 1, n = 10)
y_e = y_exact(y)
err = np.abs(y_e - y).max()
# err = np.abs(y_e - y).max()
# построение графика
plt.plot(x, y, 'r-', label = 'numerical')
plt.plot(x, y_exact, 'b-',label = 'exact', marker = '*', markersize = 3)
plt.xlabel('t')
plt.ylabel('y(t)')
plt.legend()
plt.title = "Решение для ОДУ y'= y, y(0)=1"
plt.grid()
plt.savefig('Sols.png', dpi=600)
plt.show()
Ошибка следующая возникла:
File "C:\SM2-rep\euler_ode.py", line 33, in func return x ** 2 - 2 * y_exact(x)
TypeError: 'numpy.float64' object is not callable
Подскажите пожалуйста, в чем проблема, так то все вроде бы нормально,но...