julia/DifferentialEquations 的微分方程的正确定义
correct definition of a differential equation for julia/DifferentialEquations
我有两个代码变体来求解 ODE 系统 y'=A*y+b。这个不起作用(它运行但给出了错误的结果,即它 returns 初始数据 u0 作为常量解决方案):
using LinearAlgebra
using DifferentialEquations
function RHSfun(du,u,p,t)
du= p[1]*u + p[2]
return du
end
A=[-1 0 0; 0 -1 0; 0 0 -1]
b=[1 ; 2 ; 3 ]
parm = [A,b]
tspan=(0.0,5.0)
u0=[0.0; 0.0 ; 0.0]
prob=ODEProblem(RHSfun,u0,tspan,parm)
sol=solve(prob)
但是如果我从 RHSfun 中删除参数 du 它会起作用,这似乎与文档相反(我已经解决了之前使用 du 参数定义的 ODE)。
我不是在寻求其他方式来写问题(我知道有几个可用的版本),而是想知道为什么上面的方法不起作用。我以前用 du 参数解决过 ODE,因为这是大多数教程所说的。
如果您使用就地形式,则必须确保您正在修改 du
数组,例如:
function RHSfun(du,u,p,t)
du .= p[1]*u + p[2]
return nothing
end
或更有效地使用 mul!
。请注意,您 return 并不重要。如果要使用分配形式,则不要指定可变参数:
function RHSfun(u,p,t)
du = p[1]*u + p[2]
return du
end
我有两个代码变体来求解 ODE 系统 y'=A*y+b。这个不起作用(它运行但给出了错误的结果,即它 returns 初始数据 u0 作为常量解决方案):
using LinearAlgebra
using DifferentialEquations
function RHSfun(du,u,p,t)
du= p[1]*u + p[2]
return du
end
A=[-1 0 0; 0 -1 0; 0 0 -1]
b=[1 ; 2 ; 3 ]
parm = [A,b]
tspan=(0.0,5.0)
u0=[0.0; 0.0 ; 0.0]
prob=ODEProblem(RHSfun,u0,tspan,parm)
sol=solve(prob)
但是如果我从 RHSfun 中删除参数 du 它会起作用,这似乎与文档相反(我已经解决了之前使用 du 参数定义的 ODE)。
我不是在寻求其他方式来写问题(我知道有几个可用的版本),而是想知道为什么上面的方法不起作用。我以前用 du 参数解决过 ODE,因为这是大多数教程所说的。
如果您使用就地形式,则必须确保您正在修改 du
数组,例如:
function RHSfun(du,u,p,t)
du .= p[1]*u + p[2]
return nothing
end
或更有效地使用 mul!
。请注意,您 return 并不重要。如果要使用分配形式,则不要指定可变参数:
function RHSfun(u,p,t)
du = p[1]*u + p[2]
return du
end