我正试图解决以下形式的问题:
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);
发布于 2014-08-05 15:49:33
integral2
用两个相同大小的矩阵参数调用它的integrand。问题是,你不能像你在问题中那样,把变量x,y,z,w混合在函数调用f(x,y,z,w)中,因为x和y的维数是由外部integral2
决定的,而z和w的维数是由内部integral2
决定的,因此不能保证维数是相同的。无论如何,integralX
函数并不是矢量化的,每个调用只能提供一个输出值。
函数integral
提供了一个选项,因此它只使用标量值调用它的integrand,并且通过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)
在我的实验中,后者的速度大约快六倍。
发布于 2014-09-30 15:50:55
为了补充Daniel的答案,我最终分解并编写了一个MATLAB文件交换提交,它自动为您进行嵌套,它可以处理更繁琐的情况,其中限制是函数而不是常量。它被称为integralN,它用于处理4倍、5倍和6倍的积分.我不认为这是一种攻击高维集成的好方法,但是如果它恰好足够快地为你找到工作,那么它就可以使用了。
https://stackoverflow.com/questions/25141102
复制相似问题