ODE 2-го порядка в Юлии, использующие дифференциальные уравнения - PullRequest
3 голосов
/ 12 февраля 2020

Я пытаюсь решить гармонический осциллятор c, используя Дифференциальные уравнения в Джулии. то есть:

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

Есть идеи?

1 Ответ

5 голосов
/ 12 февраля 2020

Я очень рекомендую взглянуть на некоторые учебные пособия . Здесь у вас есть несколько ошибок, которые рассматриваются в этом уроке по моделям классической физики . В частности, вы не должны использовать функцию изменения на месте, если вы выбираете переменную состояния, которая не может быть изменена, то есть скаляр. Если это так, просто используйте неуместную форму, в которой вы генерируете выходные данные. Это выглядит так:

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)
...