我正在尝试使用 Python3 用欧拉法求解这个微分方程:
根据 Wolfram Alpha 的说法,这是正确方程的图。
同样,根据 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):