我正在尝试解决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。
欢迎任何帮助,请告诉我在解释问题时是否错过了重要事项。谢谢
答案 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视为常量。
希望这会有所帮助,如果我误解了某些内容或有其他疑问,请告诉我。