在Matlab中求解矩阵值微分方程

在Matlab中求解矩阵值微分方程,matlab,ode,numerical-analysis,Matlab,Ode,Numerical Analysis,我试图解决ODE的一个特殊系统,dF/dt=a*F,F_initial=eye(9)。作为一名Matlab新手,我试图以某种方式使用已实现的ode45函数,我在网上找到了有用的建议。然而,它们都假设A是常数,而在我的例子中,矩阵A是t的函数,换句话说,A随每个时间步而变化 我分别求解了A,并将其存储在9x9xN数组中(因为我的网格是t=0:dt:2,N=2/dt是时间步数,A(:,:,I)对应于它在第I个时间步的值)。但是我不能在ode45中实现这个数组来最终解决我的ODE 欢迎任何帮助,如果我

我试图解决ODE的一个特殊系统,dF/dt=a*F,F_initial=eye(9)。作为一名Matlab新手,我试图以某种方式使用已实现的
ode45
函数,我在网上找到了有用的建议。然而,它们都假设A是常数,而在我的例子中,矩阵
A
t
的函数,换句话说,
A
随每个时间步而变化

我分别求解了
A
,并将其存储在9x9xN数组中(因为我的网格是
t=0:dt:2
N=2/dt
是时间步数,
A(:,:,I)
对应于它在第I个时间步的值)。但是我不能在
ode45
中实现这个数组来最终解决我的ODE


欢迎任何帮助,如果我在解释问题时遗漏了任何重要内容,请告诉我。谢谢

首先,使用ode45时F必须是列向量。设置F_initial=eye(9)永远不会得到结果,需要F=one(9,1)

此外,ode45不一定在给定的时间步长上计算函数,因此不能预先计算A矩阵。这里我假设F是一个列向量,a是一个作用于它的矩阵,每个时间步都可以计算。如果是这种情况,那么我们可以在传递给ode45的函数中包含,如下所示:

F_initial = ones(9,1);
dt = 0.01;
tspan = 0:2/dt:2;
[t, F] = ode45(@(t,F) foo(t, F, Ainput), tspan, F_initial);

function f = foo(t, F, Ainput)
    A = calculate_A(t, Ainput);
    f = A*F;
end

function A = calculate_A(t, Ainput)
    %some logic, calculate A based on inputs and timestep
    A = ones(9,9)*sqrt(t)*Ainput;
end
@(x)f(x,y)基本上创建了一个新的值,它允许您在计算中将y作为常量


希望这有帮助,如果我误解了什么或者你有其他问题,请告诉我。

A本身就是微分方程的解吗?“我分别解决了
A
问题”是什么意思?您知道
重塑
命令吗?A在特定时间t_n,是3x3矩阵值函数Q(t_n,x)的雅可比矩阵(即偏导数矩阵),其中x是3x3矩阵。因为在t_n时刻Q的输入和输出都有9维,所以它的雅可比矩阵是9x9,并且相对于t变化。我没听说过重塑,但我想这可能就是我要找的,谢谢。谢谢。这确实很有帮助。我的初始状态实际上是眼睛(9),
F
是一个9x9矩阵。我是否应该以某种方式将
F
转换为列形式,或者只是对每个列向量使用
ode45
9次?当然,就像LutzL建议的那样,使用
重塑
将F转换为列形式。只需在ODE函数的开头使用
重塑
,将F列向量转换为矩阵,然后在末尾将其转换回列向量,您就可以轻松实现这一点。