我一直在尝试使用四阶Runge-Kutta method来模拟一阶微分方程,但我在绘制它时遇到了问题。
#simulation of ode using 4th order rk method dy/dx=-2y+1.3e^-x,y(0)=5,h=0.01 from sympy import*
import math
import numpy as np
import matplotlib.pyplot as plt
h=0.01;
ti=0;
x=0;
n=0;
y=5;
def f(x,y):
return 1.3*math.exp(-x)-2*y
while x < 10:
k1=f(x,5);
k2=f(x+h/2,y+(h/2)* k1);
k3=f(x+h/2,y+(h/2)* k2);
k4=f(x+h,y+h*k3);
y=y+h/6*(k1+2*(k2+k3)+k4);
x=x+h;
plt.plot(x,y);
我知道问题是因为每次循环运行时更新x,y值,但是有人可以解释如何绘制(x,y)的所有值吗?
答案 0 :(得分:2)
根据评论中的建议,您可以创建两个列表来存储x
和y
值,并在while
循环后绘制它:
import math
import numpy as np
import matplotlib.pyplot as plt
h=0.01;
ti=0;
x=0;
n=0;
y=5;
def f(x,y):
return 1.3*math.exp(-x)-2*y
xs = [x] # <<<
ys = [y] # <<<
while x < 10:
k1=f(x,5);
k2=f(x+h/2,y+(h/2)* k1);
k3=f(x+h/2,y+(h/2)* k2);
k4=f(x+h,y+h*k3);
y=y+h/6*(k1+2*(k2+k3)+k4);
x=x+h;
xs.append(x) # <<<
ys.append(y) # <<<
plt.plot(xs,ys);
答案 1 :(得分:0)
错误结果的另一个来源是RK4循环中的第一行。而不是
k1=f(x,5);
使用
k1=f(x,y);
因为y
的值不会保持在初始值不变。