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

Solve a matrix valued differential equation in Matlab

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

我单独求解了A,存储在一个9x9xN的数组中(因为我的网格是t = 0:dt:2N=2/dt是时间步数,A(:,:,i) 对应于它在第 i 个时间步的值)。但是我无法在 ode45 中实现这个数组来最终求解我的 ODE。

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

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

此外,ode45 (documentation here, check tspan section) 不一定会在您给定的时间步长上计算您的函数,因此您无法预先计算 A 矩阵。在这里,我假设 F 是一个列向量,A 是一个作用于它的矩阵,可以在每个时间步计算。如果是这种情况,那么我们可以将 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) 基本上创建了一个新的 anonymous function,它允许您在计算中将 y 视为常量。

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