Использование пакета diffrentialEquations в Julia для решения матрицы ODE
Я хотел бы решить:
[\ mathbf {M} \ ddot {\ mathbf {U}} + \ mathbf {C} \ dot {\ mathbf {U}} + \ mathbf {K} \ mathbf {U} = \ mathbf {P} (t)]
Или в форме пространства состояний:
[\ Точка {\mathbf{Y}}= F (\mathbf{Y}, т)]
где:
[\ mathbf {Y} = \ left [\ begin {array} {c} \ mathbf {U} \ \ dot {\ mathbf {U} \ end {array} \ right]]
а также:
[f (\mathbf{Y}, t) = \ left [\ begin {array} {c} \ dot {\ mathbf {U}} \ \ mathbf {M} ^ {- 1} \ mathbf {P} (t) - \ mathbf {M} ^ {- 1} \ mathbf {C} \ dot {\ mathbf {U}} - \ mathbf {M} ^ {- 1} \ mathbf {K} \ mathbf {U} \ end { массив} \ right]]
Я попробовал следующий код в Юлии, используя
\ mathbf {M} = \ left [\ begin {array} {cc} 2 & 0 \ 0 & 1 \ end {array} \ right];
\ mathbf {C} = \ left [\ begin {array} {cc} 0 & 0 \ 0 & 0 \ end {array} \ right];
\ mathbf {K} = \ left [\ begin {array} {cc} 96 & -32 \ -32 & 32 \ end {array} \ right];
\ mathbf {P} (t) = \ left [\ begin {array} {c} 10 \ 10 \ end {array} \ right]
,
using DifferentialEquations
function eq(t,u,du)
v=reshape([u...],Int(length(u)/2),2)
du=reshape([v[:,2];-[10;10]-M\C*v[:,2]-M\K*v[:,1]],length(u))
end
u0=[0;0;0;0];
tspan=(0.0,10.0);
prob=ODEProblem(eq,u0,tspan)
sol=solve(prob)
Но выполнение этих строк кода приводит к этой ошибке:
ERROR: InexactError()
Я использую Julia ver. 0.5.2.
Пожалуйста, помогите мне. Спасибо.
1 ответ
Ваша проблема в том, что diffrentialEquations.jl учитывает ваш тип ввода.
u0=[0;0;0;0];
Это массив целых чисел, и это означает, что ваша задача будет развивать массив целых чисел. На первом этапе он обнаруживает, что вычисление возвращает числа с плавающей запятой, и поэтому он не знает, что делать. u
потому что вы сказали, что это должен быть массив целых чисел. Для решения этой проблемы нужно сказать, что ваша проблема связана с числами с плавающей запятой:
u0=[0.0;0.0;0.0;0.0];
Теперь это развивается правильно.
Но давайте сделаем еще один шаг. DiffrentialEquations.jl учитывает ваш тип ввода, поэтому DifferentialEquations.jl превратит его в проблему с матрицами, просто сделав начальное условие матрицей. Нет необходимости менять форму, если вы делаете u0
матрица:
u0=[0.0 0.0
0.0 0.0]
Как только вы это сделаете, вы просто напишите уравнение, которое напрямую работает с матрицами. Пример:
using DifferentialEquations
M = 1
K = 1
C = 1
function eq(t,u,du)
du .= u[:,2] .- 10 - M./C.*u[:,2] - M.\K.*u[:,1]
end
u0=[0.0 0.0
0.0 0.0]
tspan=(0.0,10.0);
prob=ODEProblem(eq,u0,tspan)
sol=solve(prob)
Я не уверен, что получил правильное уравнение, которое вы пытались решить, потому что его очень трудно читать, но это должно приблизить вас к тому, что вы хотите.