Использование пакета 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)

Я не уверен, что получил правильное уравнение, которое вы пытались решить, потому что его очень трудно читать, но это должно приблизить вас к тому, что вы хотите.

Другие вопросы по тегам