查看: 428|回复: 2|关注: 0

[已解决] 一个积分上限为变量的二重积分 内部积分为自然常数e的指数 提高效率的可能?

[复制链接]

新手

14 麦片

财富积分


050


11

主题

37

帖子

0

最佳答案

333.gif

  1. e=30000;
  2. k=10^7;
  3. tspan=300:2:1000;
  4. r=2;
  5. a=0.3;
  6. fun=@(t) integral(@(x) k.*exp(-e./r./x),300,t);
  7. A=arrayfun(@(tt) integral(@(t)(a.*k.*exp(-e./r./t)*exp(-fun(t))),300,tt,'ArrayValued',true),tspan);

复制代码

    这是经过本论坛前辈maple1314168先生的指导写出来的代码,在此表示感谢。
    取t的范围300~1000,间隔2一个点,计算对应的A值。运算一次需要约25s,请问各位朋友,这个还有提高效率的可能吗,若能,能否给小弟指点迷津?谢谢!或者只能提升硬件配置(现有配置笔记本i5-2450M 2.8GHz 4G内存)?

论坛优秀回答者

权威

3372 麦片

财富积分



2

主题

3640

帖子

758

最佳答案
  • 关注者: 154
发表于 2019-2-9 20:30:53 | 显示全部楼层 |此回复为最佳答案
本帖最后由 maple1314168 于 2019-2-9 20:35 编辑

1、简单点可以用parfor,多核计算。时间约是你核数的分之一。
2、不要求非常精确的话,可以用求解微分方程的命令ode45计算。
  1. e=30000;k=10^7;tspan=300:2:1000;r=2;a=0.3;
  2. fun=@(t) integral(@(x) k.*exp(-e./r./x),300,t);
  3. tic,A=arrayfun(@(tt) integral(@(t)(a.*k.*exp(-e./r./t)*exp(-fun(t))),300,tt,'ArrayValued',true),tspan);toc
  4. tic,dy=@(t,y)a.*k.*exp(-e./r./t)*exp(-fun(t));
  5. options = odeset('RelTol',1e-9);
  6. [~,y]=ode45(dy,tspan,0,options);toc
  7. max(abs(y-A'))
复制代码



Elapsed time is 14.416873 seconds.
Elapsed time is 0.048427 seconds.
ans =  3.5344e-06

新手

14 麦片

财富积分


050


11

主题

37

帖子

0

最佳答案
 楼主| 发表于 2019-2-9 21:21:40 | 显示全部楼层
maple1314168 发表于 2019-2-9 20:30
1、简单点可以用parfor,多核计算。时间约是你核数的分之一。
2、不要求非常精确的话,可以用求解微分方程 ...

太妙了! 用解微分方程的方式求积分,速度提高了300倍,精度的降低完全可以忽略啊!!膜拜!!非常感谢!
决定了,就用第二种方法。笔记本只是双核,而且parfor不是很了解。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

快速回复 返回顶部 返回列表