求助大神,这样的积分如何积(a,b根据不同值求出来的中间值),用matlab编写程序,或者c++都可以
MATLAB上重积分的计算方法综述
MATLAB中采用数值方法计算重积分,我所知范围内有以下资源可用:
1、对于积分上下限为固定值的情况,可以使用dblquad和triplequad函数;
2、对于积分上下限不是固定值的情况(即所谓一般区域的重积分),有以下几种方法:
最笨的做法是所谓的拓展函数法,也就是把被积函数乘上一个与积分限有关的逻辑表达式,然后调用dblquad或triplequad。这种做法效率很低,误差大,而且对于复杂积分区域的逻辑表达式也比较难写,所以很少用。
从2009a开始,增加了对一般区域二重积分的计算函数quad2d,但没有一般区域三重积分的计算函数。
第三方NIT工具箱有二重积分的quad2dggen函数。
从2012a开始,增加了integral、integral2和integral3函数。这几个函数比起早期的quad系列函数有不少改进,比如支持瑕积分以及任意区域的重积分,如果使用的是2012a之后的版本,建议使用这组函数。我猜测这几个函数应该也可以移植到早期的版本上使用,但没试。
如果使用的MATLAB版本较低(但至少应在7.0以上),可以使用SimWe仿真科技论坛rocwoods 版主提出的方法,该方法主要使用匿名函数以及arrayfun两种工具,受到不少人的推崇,还出版了一本相关的书(当然,只是部分内容)。我这里使用的就是这种方法。
借助于符号数学工具箱的int函数,即使不能求出显式解,多数情况下也能使用vpa得到足够精度的结果,但耗时往往较长(具体情况与符号运算内核有关)。
实例
1、三重积分
>> a=1;b=2;
>> quadl(@(xx) arrayfun(@(x) quadl(@(yy) arrayfun(@(y) quadl(@(z) a*(8-b)^2./((x-1).^2+y.^2+z.^2).^2,1.5,sqrt(2.405-y^2-(x-1)^2)),yy),-sqrt(0.156-(x-1)^2),sqrt(0.156-(x-1)^2)),xx),1,1.394968)
ans =
0.0405
2、二重积分
>> a=1;b=2;
>> quadl(@(xx) arrayfun(@(x) quadl(@(y) a*(8-b)^2./((x-1).^2+y.^2+(x.^2+y.^2).^2).^3,x^2-2,x^3-1),xx),1,4)
ans =
1.7039
说明
1、图片不太清晰,有些符号看不太清楚(尤其是积分限),请自行认真核实。
2、第一题的三重积分,我把积分上限原来的1.395进行微调,改为1.394968,这是因为,如果按照1.395计算,则y的积分限根号下的内容可能取值
>> 0.156-(1.395-1)^2
ans =
-2.5000e-005
从而导致结果出现复数。
3、关于我使用的方法,要说清楚需要花点时间。度娘不让贴链接,如果想详细了解,你可以自行搜索一下“一般区域二重、三重积分MATLAB计算方法”相关的内容。我上传的附件是该论坛另一位高手bainhome 把相关内容做成PDF文件,可供参考。不过,我觉得如果花点时间看看论坛原帖的讨论,可能有更大收获。
4、我使用符号的习惯与rocwoods原作略有区别。
matlab里有函数integral3做三重积分,用法示例:
fun = @(x,y,z) x.*cos(y) + x.^2.*cos(z);
xmin = -1;
xmax = 1;
ymin = @(x)-sqrt(1 - x.^2);
ymax = @(x) sqrt(1 - x.^2);
zmin = @(x,y)-sqrt(1 - x.^2 - y.^2);
zmax = @(x,y) sqrt(1 - x.^2 - y.^2);
q = integral3(fun,xmin,xmax,ymin,ymax,zmin,zmax,'Method','tiled')
照这样子,改一下公式就可以了。
文档里面 例子,积分上下限 都是常数。
谁说的。。。我写的这个就是。你刷新一下 我刚刚改了