在 Julia 中使用 DifferentialEquations 包求解矩阵 ODE

Using DifferentialEquations package in Julia to solve matrix ODE

我想解决:

[\mathbf{M} \ddot{ \mathbf{U} }+ \mathbf{C} \dot{ \mathbf{U} }+ \mathbf{K} \mathbf{U} = \mathbf{ P}(t)]

或者,在 state-space 形式中:

[\dot{\mathbf{Y}}=f(\mathbf{Y},t)]

其中:

[\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{array}\right]]

我在 Julia 中尝试了以下代码,使用

\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 版本。 0.5.2.

请帮助我。谢谢。

您的问题是 DifferentialEquations.jl 尊重您的输入类型。

u0=[0;0;0;0];

这是一个整数数组,因此这意味着您的问题将演变为一个整数数组。在第一步中,它发现它计算的是 returns 浮点数,所以它不知道要做什么 u 因为你说它必须是一个整数数组。解决方法是说您的问题出在浮点数上:

u0=[0.0;0.0;0.0;0.0];

现在进化正确了。

但让我们更进一步。 DifferentialEquations.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)

我不确定我得到了你试图求解的方程式是否正确,因为它非常难以阅读,但这应该会让你非常接近你想要的东西。