【发布时间】:2021-10-21 12:17:35
【问题描述】:
我想使用 4 阶数值方法 Runge Kutta 求解以下系统:
y'=-x-y x'=-x+sin(t)
初始条件 x(0)=0.75 和 y(0)=0
使用订单代码 4 的 RungeKutta 我试过这个:
def GlucoseTT(x, t, params):
a = params["a"]
b= params["b"]
c= params["c"]
xdot= np.array([a*x[0]-b*x[1], -c*x[0]+np.sin(t)])
return xdot
def RK4(f, x0, t0, tf, dt):
t=np.arange(t0,tf,dt)
nt=t.size
nx=x0.size
x=np.zeros((nx,nt))
x[:,0]=x0
for k in range(nt-1):
k1= dt*f(t[k], x[:,k])
k2= dt*f(t[k]+dt/2, x[:,k]+k1/2)
k3= dt*f(t[k]+dt/2, x[:,k]+k2/2)
k4= dt*f(t[k]+dt, x[:,k]+k3)
dx=(k1+2*k2+2*k3+k4)/6
x[:,k+1]=x[:,k]+dx
return x, t
#Define Problem
params = {"a":1, "b":1, "c":1}
f= lambda t, x : GlucoseTT(x, t, params)
x0= np.array([0.75,0])
#Solve ODE
t0=0
tf= 100
dt= 0.1
x,t =RK4(f, x0, t0, tf, dt)
plt.plot(t,x[0,:],"r")
我不知道这段代码是否有效......
【问题讨论】:
-
我不熟悉数学,但在 scipy 文档中的搜索显示了
scipy.integrate.RK45以及其他具有不同顺序的 Range-Kutta 函数 (docs.scipy.org/doc/scipy/reference/…)。其中一个有用吗? -
请比“我不知道此代码是否有效....”更具体一些您尝试过并遇到错误吗?程序是否通过但给出了意想不到的结果? /// 请使用代码围栏调查代码格式,并将缩进更正为实际代码的缩进,尤其是在 RK4 函数中。
-
修复缩进后,剩下的问题是方程系统的粗心和错误的转录。存在符号和索引错误。校正它们会产生预期的强制振荡,幅度稳定在 0.5。 /// 我投票关闭,因为这是一个错字级别的问题。
标签: python numerical-methods ode runge-kutta