在 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)
我不确定我得到了你试图求解的方程式是否正确,因为它非常难以阅读,但这应该会让你非常接近你想要的东西。
我想解决:
[\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)
我不确定我得到了你试图求解的方程式是否正确,因为它非常难以阅读,但这应该会让你非常接近你想要的东西。