【发布时间】:2014-03-20 14:35:55
【问题描述】:
基本上,我正在尝试使用正向欧拉法求解二阶微分方程。我的代码中有一些 for 循环,这需要相当长的时间来解决,我想加快速度。有没有人有任何建议我该怎么做?
当查看它所花费的时间时,我注意到我在第 14 行的end 占用了我总时间的 45%。 end 到底在做什么?为什么要花这么多时间?
这是我的简化代码:
t = 0:0.01:100;
dt = t(2)-t(1);
B = 3.5 * t;
F0 = 2 * t;
BB=zeros(1,length(t)); % Preallocation
x = 2; % Initial value
u = 0; % Initial value
for ii = 1:length(t)
for kk = 1:ii
BB(ii) = BB(ii) + B(kk) * u(ii-kk+1)*dt; % This line takes the most time
end % This end takes 45% of the other time
x(ii+1) = x(ii) + dt*u(ii);
u(ii+1) = u(ii) + dt * (F0(ii) - BB(ii));
end
运行代码需要 8.552 秒。
【问题讨论】:
-
您可能会通过标记正确的语言获得更多帮助,因为答案可能取决于语言。
-
您可以尝试用卷积的总和(conv 函数)替换最内层的循环,但我还没有完成。
-
另外,如果您不介意预分配
BB,不妨也预分配x和u。 -
@JoeSerrano 我尝试使用
conv函数,但它实际上比我目前的方法慢得多。
标签: performance matlab for-loop