【问题标题】:Second order ODE in Julia giving wrong resultsJulia 中的二阶 ODE 给出错误的结果
【发布时间】:2021-05-03 17:11:50
【问题描述】:

我正在尝试使用 julia 提供的DifferentialEquations.jl,它可以正常工作,直到我尝试在二阶 ODE 上使用它。 例如考虑二阶 ODE

x''(t) = x'(t) + 2* x(t),带初始条件

x'(0) = 0, x(0) = 1

它的解析解为:x(t) = 2/3 exp(-t) + 1/3 exp(2t)。

为了解决这个问题,我运行以下代码:

using DifferentialEquations;

function f_simple(ddu, du, u, p, t)
    ddu[1] = du[1] + 2*u[1] 
end;

du0 = [0.]
u0 = [1.]
tspan = (0.0,5.0)
prob2 = SecondOrderODEProblem(f_simple, du0, u0, tspan)
sol = solve(prob2,reltol=1e-8, abstol=1e-8);

这样,

sol(3)[2] = 122.57014434362732

而解析解产生 134.50945587649028,所以我在这里有点迷失了。

【问题讨论】:

  • 如果您指定一个标准积分器,如solve(prob2, alg=Tsit5()),它就可以工作。不过,使用您的示例在 github 存储库中打开一个问题可能会很好,因为这里的专业集成商似乎很不精确。
  • 这个问题其实作者去年就解决了,见stackoverflow.com/questions/60180865/…,github.com/SciML/DifferentialEquations.jl/issues/523中的cmets。请添加diffeq包的版本。
  • 请打开一个问题。
  • 我在 GitHub 上打开了一个问题。谢谢大家的帮助,这已经帮助了我很多!

标签: julia differential-equations differentialequations.jl


【解决方案1】:

根据the documentation for DifferentialEquations.jlVern7() 适用于非刚性方程的高精度解:

sol = solve(prob2, Vern7(), reltol=1e-8, abstol=1e-8)
julia> println(sol(3)[2])
134.5094558872943

在我的机器上,这与解析解非常接近。我不确定使用的默认方法是什么:文档表明solve 有一些方法可以在未指定时选择合适的求解器。

有关Vern7()的更多信息,请查看Jim Verner's page on Runge-Kutta algorithms

【讨论】:

  • Vern7不是根据提供的reltol自动选择的问题吗?
猜你喜欢
  • 2020-05-27
  • 1970-01-01
  • 1970-01-01
  • 2013-11-08
  • 1970-01-01
  • 2014-09-16
  • 2011-11-15
  • 2019-02-06
  • 2014-01-30
相关资源
最近更新 更多