我想在Julia中使用DifferentialEquations
来求解double pendulum方程。对于一些初始值,我得到了错误:
WARNING: dt <= dtmin. Aborting. If you would like to force continuation with
dt=dtmin, set force_dtmin=true
如果我使用force_dtmin=true
,则会得到:
WARNING: Instability detected. Aborting
我不知道要做什么,这是代码:
using DifferentialEquations
using Plots
m = 1
l = 0.3
g = pi*pi
function dbpen(du,u,pram,t)
th1 = u[1]
th2 = u[2]
thdot1 = du[1]
thdot2 = du[2]
p1 = u[3]
p2 = u[4]
du[1] = (6/(m*l^2))*(2*p1-3*p2*cos(th1-th2))/(16-9*(cos(th1-th2))^2)
du[2] = (6/(m*l^2))*(8*p2-3*p1*cos(th1-th2))/(16-9*(cos(th1-th2))^2)
du[3] = (-0.5*m*l^2)*(thdot1*thdot2*sin(th1-th2)+(3*g/l)*sin(th1))
du[4] = (-0.5*m*l^2)*(-thdot1*thdot2*sin(th1-th2)+(g/l)*sin(th2))
end
u0 = [0.051;0.0;0.0;0.0]
tspan = (0.0,100.0)
prob = ODEProblem(dbpen,u0,tspan)
sol = solve(prob)
plot(sol,vars=(0,1))
答案 0 :(得分:1)
我最近更改了此警告,以明确地告诉用户这很可能是模型问题。如果您看到此消息,那么通常会有两个可能的问题:
虽然(1)经常出现,但如今自动算法会自动检测到它,因此问题几乎总是(2)。
因此,您可以做的是打印出计算出的导数,然后看它是否符合您的期望。如果您这样做了,那么您会发现
thdot1 = du[1]
thdot2 = du[2]
为您提供可以无限小/大的伪值。原因是因为您应该覆盖它们!因此,您似乎真正想做的是计算前两个导数项,并在第二组导数项中使用它们。为此,必须确保先更新值!一种可能的代码如下所示:
function dbpen(du,u,pram,t)
th1 = u[1]
th2 = u[2]
p1 = u[3]
p2 = u[4]
du[1] = (6/(m*l^2))*(2*p1-3*p2*cos(th1-th2))/(16-9*(cos(th1-th2))^2)
du[2] = (6/(m*l^2))*(8*p2-3*p1*cos(th1-th2))/(16-9*(cos(th1-th2))^2)
thdot1 = du[1]
thdot2 = du[2]
du[3] = (-0.5*m*l^2)*(thdot1*thdot2*sin(th1-th2)+(3*g/l)*sin(th1))
du[4] = (-0.5*m*l^2)*(-thdot1*thdot2*sin(th1-th2)+(g/l)*sin(th2))
end
制造:
答案 1 :(得分:0)
似乎您的ODE很僵硬,默认情况下要求极小的dt。 您可以切换到严格的ODE求解器,或者给出如下提示:
sol = solve(prob,alg_hints=[:stiff])
参考:软件包文档中的ODE示例