Я пытаюсь решить это дифференциальное уравнение методом Эйлера, используя Python3:
Согласно Wolfram Alpha, это сюжет правильногоуравнение.
Опять-таки, согласно Вольфраму Альфе, в этом случае классический метод Эйлера должен не быть стабильным, как вы можетесм. к концу интервала:
Однако в моей реализации метод Эйлера обеспечивает стабильный результат, что странно .Интересно, что моя реализация по какой-то причине неверна.Тем не менее, я не могу найти ошибку.
Я сгенерировал несколько точек и график, сравнивающий мое приближение и аналитический вывод функции.В синем цвете аналитический результат в качестве контрольной группы.Красным цветом вывод моей реализации:
Вот мой код:
import math
import numpy as np
from matplotlib import pyplot as plt
import pylab
def f(x):
return (math.e)**(-10*x)
def euler(x):
y_init = 1
x_init = 0
old_dy_dx = -10*y_init
old_y = y_init
new_y = None
new_dy_dx = None
delta_x = 0.001
limite = 0
while x>limite:
#for i in range(1,6):
new_y = delta_x*old_dy_dx + old_y
#print ("new_y", new_y)
new_dy_dx = -10*new_y
#print ("new dy_dx", new_dy_dx)
old_y = new_y
#print ("old_y", old_y)
old_dy_dx = new_dy_dx
#print ("old delta y_delta x", old_dy_dx)
#print ("iterada",i)
limite = limite +delta_x
return new_y
t = np.linspace(-1,5, 80)
lista_outputs = []
for i in t:
lista_outputs.append(euler(i))
print (i)
# red dashes, blue squares and green triangles
plt.plot(t, f(t), 'b-', label='Output resultado analítico')
plt.plot(t , lista_outputs, 'ro', label="Output resultado numérico")
plt.title('Comparação Euler/Analítico - tolerância: 0.3')
pylab.legend(loc='upper left')
plt.show()
Спасибо за помощь.
=================================================================
ОБНОВЛЕНИЕ
С помощью @SourabhBhat я смог увидеть, что моя реализация на самом делеправо.Это действительно вызывало нестабильность.Помимо увеличения размера шага, мне нужно было сделать некоторое увеличение, чтобы увидеть, как это происходит.
Изображение ниже говорит само за себя (размер шага 0,22):