在 Matlab 中求解矩阵值微分方程
Solve a matrix valued differential equation in Matlab
我正在尝试求解 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 = 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 视为常量。
希望这对您有所帮助,如果我误解了什么或者您有其他问题,请告诉我。
我正在尝试求解 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 = 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 视为常量。
希望这对您有所帮助,如果我误解了什么或者您有其他问题,请告诉我。