0
我在写一些代码来求解二阶微分方程,但是它给出了一个完全错误的结果。我认为问题在于以正确的方式表达欧拉方法。我也尝试了另一个二阶ODE,但我也未能近似y(x)。你能指出哪里可能出错吗?请参阅图形和代码:用python解决二阶ODE
求解ODE:
y"(x)=-1001y'(x)-1000y(x)
y(0)=1, y'(0)=0
解析解:
y(x)=(1000exp(-x)-exp(-1000x))/999
重写为2个常微分方程的系统;
y'(x)=v(x)
v'(x)=-1001v(x)-1000y(x)=f(x,y,v)
y(0)=1,v(0)=0
在Jupyter笔记本的代码(蟒蛇):
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
a=-0.0020
b=0.0
h=0.0005 #step size
x=np.arange(a,b,h)
n=int((b-a)/h)
def y_exact(x):
return (1000*np.exp(-x)-np.exp(-1000*x))/999
def f(y,v):
return -1001*v-1000*y
y_eu=np.zeros(n,float)
y_ei=np.zeros(n,float)
y_eu[0]=1.0
y_ei[0]=1.0
v_eu[0]=0.0
v_ei[0]=0.0
for j in range(0,n-1):
#Euler's method (explicit)
y_eu[j+1]=y_eu[j]+v_eu[j]*h
v_eu[j+1]=v_eu[j]+f(y_eu[j],v_eu[j])*h
#Implicit Euler's method
v_ei[j+1]=(v_ei[j]-1000*y_ei[j]*h)/(1+1001*h+1000*h**2)
y_ei[j+1]=y_ei[j]+v_ei[j+1]*h
plt.plot(x,y_exact(x),label="Exact solution")
plt.plot(x,y_eu,label="Euler's method")
plt.plot(x,y_ei,label="Implicit Euler's method")
plt.legend()
plt.show()
谢谢!
为什么试图再次实现它们?你可以使用[sympy](http://docs.sympy.org/latest/modules/solvers/ode.html#ode-docs) –
和你的'y_eu [0]'等不正确。 'y_eu [0]'是-0.0020的值,而不是0 –
或者换句话说,为了反映使用的初始值和积分方向,你必须使用'plot(x,y_exact(xa),label = “精确的解决方案”),当将“h”减少10倍时,它给出了很好的视觉融合。 – LutzL