基于微分方程的Julia二阶常微分方程

基于微分方程的Julia二阶常微分方程,julia,ode,Julia,Ode,我试图用朱莉娅的微分方程来解谐振子。i、 e: 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

我试图用朱莉娅的微分方程来解谐振子。i、 e:

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

有什么想法吗?

我强烈建议您看看。你这里有几个错误,已经解决了。具体地说,如果您选择的状态变量不能进行变异,即标量,则不应使用就地修改函数。如果是这种情况,只需使用生成输出的不合适表单。这看起来像:

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)

注意,从这一点上,我意识到二阶常微分方程的默认算法有些愚蠢,所以我今晚要修正它:修正微分方程v6.11。现在默认算法适用于
SecondOrderODEProblem
啊,我明白你的意思了,关于朱莉娅,我还有很多要了解的。然而,当我尝试实现您的解决方案时,它给了我以下信息:
ERROR:LoadError:type DynamicalODEFunction没有字段jac_prototype Stacktrace:[1]getproperty at./Base.jl:20[inlined][2]build_J_W(::Rosenbrock23{0,false,DefaultLinSolve,DataType},::arrarypartition{Float64,Tuple{Float64,Float64},::arrarypartition{Float64,Tuple{Floa t64,Float64},::DiffEqBase.NullParameters,::Float64,::Float64,::Function,::Type,::Val{false})
如果你更新了你的包,它是固定的。这是在昨晚的DiffEq v6.11版本中。没有这个版本,你需要执行
sol=solve(prob,DPRKN6())
,或者任何你想要的方法,但它必须指定。