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

时间:2018-08-30 17:38:42

标签: matlab ode numerical-analysis

我正在尝试解决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。

欢迎任何帮助,请告诉我在解释问题时是否错过了重要事项。谢谢

1 个答案:

答案 0 :(得分:1)

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

此外,ode45 (documentation here, check tspan section)不一定在给出的时间步上评估您的函数,因此您无法预先计算A矩阵。在这里,我将假设F是列向量,而A是对其起作用的矩阵,可以在每个时间步长进行计算。如果是这种情况,那么我们只需在传递给ode45的函数中包含A即可,

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视为常量。

希望这会有所帮助,如果我误解了某些内容或有其他疑问,请告诉我。