【问题标题】:2nd Order ODEs in Julia using DifferentialEquationsJulia 中使用微分方程的二阶 ODE
【发布时间】:2020-05-27 13:40:19
【问题描述】:

我正在尝试使用 Julia 中的微分方程求解谐波振荡器。即:

using DifferentialEquations
using Plots

m = 1.0                          
ω = 1.0                     

function mass_system!(ddu,du,u,p,t)
    # a(t) = (1/m) w^2 x 
    ddu[1] = (1/m)*(ω^2)*u[1]
end

v0 = 0.0                     
u0 = 1.0                  
tspan = (0.0,10.0)               

prob = SecondOrderODEProblem{isinplace}(mass_system!,v0,u0,tspan,callback=CallbackSet())
sol = solve(prob)

但它似乎不理解 ODE 构造函数。运行后,我得到:

ERROR: LoadError: TypeError: non-boolean (typeof(isinplace)) used in boolean context
Stacktrace:
 [1] #_#219(::Base.Iterators.Pairs{Symbol,CallbackSet{Tuple{},Tuple{}},Tuple{Symbol},NamedTuple{(:callback,),Tuple{CallbackSet{Tuple{},Tuple{}}}}}, ::Type{SecondOrderODEProblem{DiffEqBas
e.isinplace}}, ::Function, ::Float64, ::Float64, ::Tuple{Float64,Float64}, ::DiffEqBase.NullParameters) at /Users/brandonmanley/.julia/packages/DiffEqBase/avuk1/src/problems/ode_problems
.jl:144
 [2] Type at ./none:0 [inlined] (repeats 2 times)
 [3] top-level scope at /Users/brandonmanley/Desktop/nBody/nBodyNN/test.jl:25
 [4] include at ./boot.jl:328 [inlined]
 [5] include_relative(::Module, ::String) at ./loading.jl:1105
 [6] include(::Module, ::String) at ./Base.jl:31
 [7] exec_options(::Base.JLOptions) at ./client.jl:287
 [8] _start() at ./client.jl:460

有什么想法吗?

【问题讨论】:

    标签: julia ode


    【解决方案1】:

    我强烈建议您查看some of the tutorials。您在这里有一些错误,已解决 in this tutorial on classical physics models。具体来说,如果您选择不能变异的状态变量(即标量),则不应使用就地修改函数。如果是这种情况,只需使用生成输出的异地表单即可。看起来像:

    using DifferentialEquations
    using Plots
    
    m = 1.0                          
    ω = 1.0                     
    
    function mass_system!(du,u,p,t)
        # a(t) = (1/m) w^2 x 
        (1/m)*(ω^2)*u[1]
    end
    
    v0 = 0.0                     
    u0 = 1.0                  
    tspan = (0.0,10.0)               
    
    prob = SecondOrderODEProblem(mass_system!,v0,u0,tspan)
    sol = solve(prob)
    

    【讨论】:

    • 注意,从这里我意识到你得到的二阶 ODE 的默认算法有点傻,所以我今晚修复它:github.com/JuliaDiffEq/DifferentialEquations.jl/pull/567
    • 修复了微分方程 v6.11。现在默认算法适用于SecondOrderODEProblem
    • 啊,我明白你的意思了,关于 Julia,我还有很多东西要学。但是,当我尝试实施您的解决方案时,它给了我以下信息:ERROR: LoadError: type DynamicalODEFunction has no field jac_prototype Stacktrace: [1] getproperty at ./Base.jl:20 [inlined] [2] build_J_W(::Rosenbrock23{0,false,DefaultLinSolve,DataType}, ::ArrayPartition{Float64,Tuple{Float64,Float64}}, ::ArrayPartition{Float64,Tuple{Floa t64,Float64}}, ::DiffEqBase.NullParameters, ::Float64, ::Float64, ::Function, ::Type, ::Val{false})
    • 如果你更新你的包,它是固定的。这是昨晚的 DiffEq v6.11 版本。如果没有该版本,您将需要执行 sol = solve(prob,DPRKN6()) 或任何您想要的方法,但必须指定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-29
    相关资源
    最近更新 更多