找回密码
 注册
Simdroid-非首页
查看: 868|回复: 11

MATLAB R2009a 新增函数quad2d介绍

[复制链接]
发表于 2009-4-9 19:59:36 | 显示全部楼层 |阅读模式 来自 北京朝阳
本帖最后由 rocwoods 于 2009-4-9 20:02 编辑

我们知道,对于一般区域上的二重积分,MATLAB向来支持不好,7版本之前不能通过简单的形式直接求取一般区域上的的二重积分,往往要借助NIT工具箱来实现。后来到了7版本,MATLAB引入了匿名函数结构,dblquad的被积函数可以是匿名函数的形式,它的帮助文档也给出了用dblquad求一般区域上二重积分的简单说明。说白了,就是将积分区域表示成逻辑表达式形式并与被积函数相乘,本质上还是计算的矩形区域的积分。
    我们仔细分析就会发现,实际上,这种办法是把原被积函数外推到了一个矩形区域上来实现的,该矩形区域包含了被积区域,在被积区域上,外推函数取值和原函数一样,而在矩形区域内被积区域外的那部分,外推函数取值都为0.这样外推函数在矩形区域上积分的结果就等于原被积函数在被积区域的结果。这种数学上简单的变换导致的结果就是按这种办法,计算量大增,特别是被积区域非常不规则并布满整个矩形区域的时候。
    让人高兴的是,2009a版本终于专门求解一般区域二重积分的函数——quad2d
最简单的调用格式(详细使用可以参考帮助文档)是

  1. y = quad2d(f,a,b,c,d);
复制代码
其中,f是被积函数,可以是匿名函数,句柄,内联函数等等。a,b是最外重积分的常数项。c,d可以使常数也可以是匿名函数,代表内层积分的上下限。
举个例子说明:被积函数f(x,y) = sqrt(10^4-x^2) 在x^2+y^2<=10^4区域的积分
大家可以比较下面两行代码的运算时间
  1. tic,y1 = dblquad(@(x,y) sqrt(10^4-x.^2).*(x.^2+y.^2<=10^4),-100,100,-100,100 ),toc
  2. tic,y2 = quad2d(@(x,y) sqrt(10^4-x.^2),-100,100,@(x)-sqrt(10^4-x.^2),@(x)sqrt(10^4-x.^2)),toc
复制代码
在我的电脑上,上面两种方法速度相差500多倍。
可见,quad2d才是真正有效求解一般区域二重积分的函数。
可惜现在没见到一般区域三重积分的函数,求解一般区域三重积分可能还得将其外推到长方体,然后用triplequad。希望未来的版本看到求解一般区域三重积分的函数。
发表于 2009-4-9 20:38:29 | 显示全部楼层 来自 黑龙江哈尔滨
Simdroid开发平台
matlab的工具箱不都是人编出来的吗,楼主既然算法搞的比较清楚,可以研究一下他的这个函数,然后推广一下,整个三重积分的函数出来
回复 不支持

使用道具 举报

发表于 2009-4-10 14:59:13 | 显示全部楼层 来自 陕西西安
呵呵,很好,不知道其它工具箱有没有出新的、等有空下个2009,研究一下里面的新功能
不过硬盘似乎找不到空2g以上的了
回复 不支持

使用道具 举报

发表于 2009-6-16 10:48:36 | 显示全部楼层 来自 北京
我们知道,对于一般区域上的二重积分,MATLAB向来支持不好,7版本之前不能通过简单的形式直接求取一般区域上的的二重积分,往往要借助NIT工具箱来实现。后来到了7版本,MATLAB引入了匿名函数结构,dblquad的被积函数 ...
rocwoods 发表于 2009-4-9 19:59

终于装上2009a了,试了一下rocwoods的代码
两者的时间差了32倍多,好像没有达到500多倍
回复 不支持

使用道具 举报

 楼主| 发表于 2009-6-16 13:53:11 | 显示全部楼层 来自 北京朝阳
多运行几次试试呢?我这里速度起码差500倍
回复 不支持

使用道具 举报

发表于 2009-6-16 14:16:24 | 显示全部楼层 来自 北京
本帖最后由 ljelly 于 2009-6-16 14:18 编辑
多运行几次试试呢?我这里速度起码差500倍
rocwoods 发表于 2009-6-16 13:53


运行几次后,速度就上来了,这是为什么呢?
现在都达到1300多倍了,是因为新函数支持多核的关系吗?

还是另有玄机?
回复 不支持

使用道具 举报

 楼主| 发表于 2009-6-16 14:23:02 | 显示全部楼层 来自 北京朝阳
本帖最后由 rocwoods 于 2009-6-16 14:25 编辑

新函数内部怎么处理不是很清楚,不过可以肯定的是因为第一次运行的时候很多时间开销花在了在路径上寻找所要的函数并解析它,这部分时间相对函数本身执行来说占了相当比重。以后再运行,寻找并解析函数的时间就忽略了。所以准确的判断函数运行效率应该是从第二次开始,多次运行取时间的平均值。
上面举得例子用dblquad存在很多乘0运算,这也是很耗时的原因之一。
回复 不支持

使用道具 举报

发表于 2009-12-7 00:32:08 | 显示全部楼层 来自 河北秦皇岛
本帖最后由 gentlefu 于 2009-12-10 23:02 编辑

rocwoods版主:
我的那个四重积分用这个函数算的比较好了,可是在我对附件中的那个函数在区域中找最小值的时候(fminbnd) 总是出现以下错误:
warning:Reached the maximum number of function evaluations (2000),The result fails the global error test.
然后就是重新算,有的点要出来十几个类似的warning,而且很奇怪明明是同一个点循环的次数不同时,有的可以没有提示就算成功,有的却要好多次才成功,哎……增加到4000,问题依旧
dd=0时,算的比较好)(没有提示错误) dd=0.8时 就好多好多warning,八核(至强2.0)算了两天还没有出结果,郁闷死了 始终没有找到解决办法,可能是fminbnd的区间取大了,function evaluations 不够?
另:本来是想把附件中的zz到最后再找最小值,可是不知道怎么办,我就直接弄成一个  表达式,看起来太长了……
您有空给看看吧 谢谢

初步以为是精度的问题 可是精度在降为1e-2以后,parfor循环的最后几个点 问题依旧

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 不支持

使用道具 举报

发表于 2010-2-6 00:41:34 | 显示全部楼层 来自 美国
四重积分怎么算?
回复 不支持

使用道具 举报

发表于 2010-5-16 14:21:59 | 显示全部楼层 来自 湖北武汉
好东东,值得学习
回复 不支持

使用道具 举报

发表于 2012-4-20 16:42:05 | 显示全部楼层 来自 山西太原
楼主真是牛啊,谢谢分享
回复 不支持

使用道具 举报

发表于 2013-6-10 10:54:55 | 显示全部楼层 来自 重庆
楼主,崇拜你:),如果是一重积分,但是被积函数含有时滞,怎么办?比如说x(t-tao),tao为时滞,而x又是一个时滞微分方程的解,这种的话程序要怎么写呢?
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-3-29 19:49 , Processed in 0.050664 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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