陆永杰 发表于 2008-9-17 09:34

计算一个分岔图要有时候24小时以上,1000s的循环也算时间长啊

ChaChing 发表于 2008-9-17 09:42

非常同意bainhome的看法 !
本来不同软件之间各有优劣, 硬要去比较其优劣, 实在没必要
若要比执行速度, 我认为绝对不是matlab的主要优点(虽然亦可以优化及p Code ...)
matlab主要优点应是方便性强, 编辑较直觉性, 交换沟通较容易 ...
既然要用, 就需要知道其一般语法的正确使用方法
若很在意执行时间的话, 使用更低阶的程式语言一定是比较快
但同样的亦需正确使用

jojocleo 发表于 2008-9-17 15:04

没有想到能够引来大家发表了这么多议论,先谢谢大家的参与。我挺赞同楼上说的一句话“有时,优化时间可能比计算时间付出更大的代价”,我也一直在想办法优化程序,在某些方面取得了一些效果,但是有碰到了很多的问题。我的问题主要是在循环调用程序积分方面的,自己也尝试过优化,下面把心得说一下,希望能对大家有所帮助,有不对之处请指正!
积分表达式a*x+1,其中a为变量,求a为1~1000时的积分值。
1)直接调用M子函数
for a=1:1000quad(@(x)fm(x,a),0,1);

endfunction y=fm(x,a)y=a*x+1;end

Elapsed time is 0.486639 seconds.2)function handle
fh=@fm;for a=1:1000quad(@(x)fh(x,a),0,1);

endElapsed time is 0.467544 seconds.
3)匿名函数
f= @(x,a)a*x+1;for a=1:1000quad(f,0,1,1e-6,0,a);

end
Elapsed time is 0.213994 seconds.
4)inline function
fi=inline('a*x + 1', 'x','a');for a=1:1000quad(@(x)fh(x,a),0,1);

end
Elapsed time is 0.457284 seconds.
5)quadv命令调用子函数
a=1:100000;quadv(@(x)fm(x,a),0,1);
%0.002s
Elapsed time is 0.037595 seconds.
6)quadv命令调用匿名函数
f= @(x,a)a*x+1;a=1:100000;quadv(@(x)f(x,a),0,1);
%0.002sElapsed time is 0.034381 seconds.
这个是我自己做的一些比较,跟网上的一篇文章有些类似。可以看到使用quadv命令的速度是最快的(注意:quadv的两个程序a取值到了10000!),quadv命令应该就是矢量化的一种表现吧。使用quadv命令的同时,使用匿名函数又略微快一些,当子函数定义比较复杂带有很多变量传递时,这种差别格外明显。
我的问题可以这样表达:上述程序6)为一个子程序,主程序通过循环把变量传递给子程序进行积分计算,当计算量很大时(循环比较大),profile发现主要占用时间产生自匿名函数f的定义上,quadv命令反而没有占用那么多时间,这个有没有什么办法解决?
上述的这个问题速度上其实也能够接受,但是要是二重积分碰到这个问题呢?二重积分有没有quadv类似的命令呢?
请大家指点!

yangchaox 发表于 2009-9-17 10:50

ode45 积分表达式太长,机器卡死,求助,谢谢

function dy=yy(t,y,mu)
dy=zeros(2,1);
dy(1)=y(2);
dy(2)=f(mu,t)%f(mu,t) 是由别的程序求出来的一个表达式,非常长就不贴出来了,
这是函数文件
clc
clear
i=1;
for mu=1:4
tt=0.1;
tspan=linspace(0,tt,100);
y0=;
=ode45(@yy,tspan,y0,[],mu);
yyy(i)=y(100,1)
i=i+1
end
在运行时就卡死了,f(mu,t) 表达式太长在此怎么处理?谢谢!急!
页: 1 [2]
查看完整版本: 感慨了,matlab数值积分速度太慢.