Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
|
![]() |
#1 |
高级会员
注册日期: 2019-11-21
帖子: 3,006
声望力: 66 ![]() |
![]()
我希望我在这里成为话题。我要问的是它在常见问题页面上说的:一个(除其他外)有关软件算法的问题:)
我需要解决一个ODE系统(例如$ \ dot x = A(t)x $。矩阵A可能会更改,并在函数调用中以字符串形式给出(Calc_EDS_v2('Sys_EDS_a',...) 然后我在循环中使用ode45来找到我的x: function [intervals, testing] = EDS_calc_v2(smA,options,debug) [..] for t=t_start:t_step:t_end) [Te,Qe]=func_int(@intQ_2_v2,[t,t+t_step],q); q=Qe(end,:); [..] end [..] func_int是ode45,@ intQ_2_v2是我的m文件。 q作为开始向量返回给调用。如您所见,我只是在间隔[t,t + t_step]上使用ode45。那是因为我的系统矩阵A可以强制ode45使用很多步骤,从而使其很快达到AbsTol或RelTol。 现在我的A类似于B(t)* Q(t),因此在m文件intQ_2_v2.m中,我需要在时间t评估B和Q。我首先这样做是这样的:(v1 -file,因此函数名称不同) function q=intQ_2_v1(t,X) [..] B(1)=...; ... B(4)=...; Q(1)=...; ... 当然,仅在假设A是2x2矩阵的情况下才可以实现上述目的。通过该设置,基本系统的计算时间大约在10到15秒之间。 我现在使用文件B1.m到B4.m和Q1.m到B4.m(我知道不是很优雅,但是稍后我需要在B上使用quadgk,并且quadgk不支持矩阵函数。 ) function q=intQ_2_v2(t,X) [..] global funcnameQ, funcnameB, d for k=1:d Q(k)=feval(str2func([funcnameQ,int2str(k)]),t); B(k)=feval(str2func([funcnameB,int2str(k)]),t); end [..] 引用B或Q(加上k)的funcname(字符串),而d是系统的维数。 现在,我知道它将比第一个版本花费更多时间,但我发现计算时间是原来的十倍! (获取150到160秒)我确实知道打开4个文件并为每个ode-loop评估大约40次是昂贵的...而且我也无法预先评估B和Q,因为ode45使用自适应步长... 有没有办法不使用最后一个循环? 通常,我对降低计算时间的解决方案很感兴趣。我确实感觉到我缺少了一些东西……但是不能真正把手指放在上面。在那一次花了将近3分钟而不是10秒的时间之后,我现在可以在每次测试之间喝杯咖啡了……(请不要告诉我要买一台更快的计算机) (很长的问题很抱歉) 回答: 我不确定我是否完全了解您在这里做什么,但是我可以提供一些提示。
更多&回答... |
![]() |
![]() |