我有一个僵硬的耦合 ODE 系统,我提供给 MATLAB 的ode15s
求解器。它运作良好,但现在我正在尝试优化集成速度。我在N
不同的空间站点上对 5 个不同的变量进行建模,给出 5N 个耦合方程。目前,N=20
积分时间约为 25 秒,但我想使用更大的N
.
我使用分析器发现绝大多数时间都花在了评估myODEfun
上。我尽我最大的努力优化代码,但这并没有改变函数中有很多事情发生并且它正在被评估约 50,000 次的事实。我读到使用该'Vectorized'
属性ODEfunction
可以减少所需的评估次数。
但我不太明白我需要改变什么ODEfun
以使其符合 Matlab 想要的'vectorized'
ODEfun
外观。
从文档中我看到您可以将示例范德波尔系统从其正常形式更改:
function dydt = vdp1000(t,y)
dydt = [y(2); 1000*(1-y(1)^2)*y(2)-y(1)];
到矢量化形式:
function dydt = vdp1000(t,y)
dydt = [y(2,:); 1000*(1-y(1,:).^2).*y(2,:)-y(1,:)];
我不明白这个新矩阵y
应该代表什么,以及如何定义第二维的大小。我几乎可以只添加“ ,:
”而不考虑它,但我遇到了问题,因为我已经在我的代码中进行了一些向量操作。
这是我当前功能的简化示例,还没有vectorized
。它模拟 2 个变量,制作2*N
方程。请不要试图理解此处生成的 ODE:它们没有。我说的是正在发生的操作。
function dydt = exampleODEfun(t,y,N)
dydt = zeros(2*N,1);
dTdt = zeros(N,1);
dXdt = zeros(N,1);
T = y(1:N);
X = y(N+1:2*N);
a = [T(2:N).^2 T(2:N) ones(N-1,1)];
b = [3 5 -2];
dTdt(1:N) = 0;
dXdt(1) = 0;
dXdt(2:N) = a*b';
dydt(1:N) = dTdt;
dydt(N+1:2*N) = dXdt;
end
显然,在真正的函数中还有更多的事情发生,无论是 forT
还是X
. 如您所见,dXdt(1)
是一个边界条件,需要自己计算。
盲目地传递 odeset'Vectorized','on'
并在所有索引中添加“ ,:
”是行不通的。例如,我现在需要初始化什么dTdt
大小dXdt
?我该怎么办ones(N-1,1)
?我需要做什么才能使 ( a*b'
) 仍然有意义?
我正在使用 Matlab R2006a。