在Matlab中使用嵌套Integral2的四重积分

时间:2014-08-05 14:19:21

标签: matlab numerical-integration nested-function

我正在尝试解决以下形式的问题:

f=@(x,y,z,w) x.*y.*z.*w;          % A complicated black box function
a=1;b=1;c=1;d=1;                  % Integration limits
I=integral2(@(x,y)integral2(@(z,w)f(x,y,z,w),c,-c,d,-d),a,-a,b,-b);

使用此实现,我收到以下错误:

Error using  .* 
Matrix dimensions must agree.

问题是x,y,z和w的大小不同。对于第一个函数评估,所有输入都是相同的大小,但是在第二个函数评估中,x和y与z和w的大小不同。

如何解决此错误?

这个问题类似于这个悬而未决的问题: Input array size error for a quadraple integration using nested integral2

=============================================== ===================================

回答答案:

I=integral(@(x)integral3(@(y,z,w)f(x,y,z,w),b,-b,c,-c,d,-d),a,-a,'ArrayValued',true);

这确实解决了这个问题,但是,为什么这个问题对我来说并不明显。我以前见过这个解决方案,但忘记在我的问题中提到它(http://www.mathworks.com/matlabcentral/answers/77571-how-to-perform-4d-integral-in-matlab)。

我想用嵌套的integral2来解决,因为我知道我的函数是不连续的,并且想要使用迭代积分方法。我可以做这样的事情,但只迭代内部积分,所以我不确定这会如何影响准确性:

I=integral(@(x)integral3(@(y,z,w)f(x,y,z,w),b,-b,c,-c,d,-d,'Method','iterated'),a,-a,'ArrayValued',true);

2 个答案:

答案 0 :(得分:1)

integral2使用两个大小相同的矩阵参数调用其integrand。问题是你不能像在你的问题中那样在函数调用f(x,y,z,w)中混合变量x,y,z,w,因为x和y的维数是由外integral2确定,而z和w的维度由内integral2确定,因此不保证维度相同。 integralX函数无论如何都不会向量化,每次调用只能提供一个输出值。

函数integral提供了一个选项,以便它仅使用标量值调用其被积函数,并且通过Matlab标量扩展,它与内部函数integral3提供的相同大小的3D数组一起工作。

I=integral(@(x)integral3(@(y,z,w)f(x,y,z,w),b,-b,c,-c,d,-d),a,-a,'ArrayValued',true);

你可以通过使用arrayfun封装内部的integral2调用来实现相同的(使用标量调用):

I=integral2(@(x,y)arrayfun(@(x,y)integral2(@(z,w)f(x,y,z,w),c1,c2,d1,d2),x,y),a1,a2,b1,b2)

后者在我的实验中快了大约六倍。

答案 1 :(得分:0)

为了补充丹尼尔的答案,我终于打破了并写了一个MATLAB文件交换提交,自动为你做嵌套,它可以处理限制是函数而不是常量的更繁琐的情况。它被称为integralN,它被编写为处理4倍,5倍和6倍积分。我不认为它是攻击高维集成的好方法,但如果它恰好足以让你找到工作,那么就可以使用了。