如何为integral2矢量化函数?

时间:2013-03-21 19:08:25

标签: matlab numerical-integration

我想评估表单的双重积分 $$ \ int _ { - \ infty} ^ a \ int _ { - \ infty} ^ b \ sum_ {i,j} ^ K a_ia_jx ^ iy ^ j \ exp(-x ^ 2 - y ^ 2 + xy)dx dy $$

其中$ a_i $和$ a_j $是常量。由于积分是线性的,我可以互换求和和积分,但在这种情况下,我必须评估$ K ^ 2 $积分,这需要太长时间。在这种情况下,我会执行以下操作:

for i = 1:K
   for j = 1:K
       fun = @(x,y) x.^i.*y.^j.*exp(-2.*(x.^2 + y.^2 - 2.*x.*y))
       part(i,j) = alpha(i)*alpha(j)*integral2(fun,-inf,a,-inf,b)
   end
end

这需要太长时间,所以我只想评估一个积分,但我不知道如何矢量化$ \ sum_ {i,j} ^ K a_ia_jx ^ iy ^ j \ exp(-x ^ 2 - y ^ 2 + xy)$,即如何将它提供给integral2。我会非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

  1. 如果您只想提高速度,可以尝试parfor。

  2. 设$ X =(x,x ^ 2,\ cdots,x ^ K)$,$ Y =(y,y ^ 2,\ cdots,y ^ K)$,$ A =(a_ {ij})$是$ a_ {ij} = a_ {i} a_ {j} $的矩阵,然后 $$ \ sum_ {i,j} ^ K a_ {i} a_ {j} x ^ iy ^ j = XAY ^ {T} $$

  3. 我的matlab上没有integral2功能,所以我没有测试它是否会提高速度。

    另外,我认为在计算$$ XAY ^ {T} $$之后需要使用syms x和y,然后使用matlabFunction将符号表达式转换为函数句柄。这是我的测试代码:syms x y; X = [X,X ^ 2]; Y = [Y,Y ^ 2]; Z = X * Y'; fun = matlabFunction(Z); ff = @(x,y)x ^ 2 + y ^ 2; 。GG =乐趣(X,Y)* FF(X,Y);

答案 1 :(得分:0)

看起来你需要让i和j成为第三和第四维度,以便代码有可能工作。

我也没有integral2(我使用octave,integral2是一个新的matlab函数,八度音程还没有),所以我无法测试它,但我认为这样的东西可能会起作用:< / p>

alphaset=zeros(1,1,K,K);
alphaset(1,1,1:K,1:K)=alpha(1:K)'*alpha(1:K);
i_set=zeros(1,1,K,1);
j_set=zeros(1,1,1,K);
i_set(:)=1:K;
j_set(:)=1:K;
fun=@(x,y)  x.^i_set.*y.^j_set.*exp(-2.*(x.^2 + y.^2 - 2.*x.*y));
part = squeeze(alphaset.*integral2(fun,-inf,a,-inf,b));

正如我所说,我不能保证它会起作用,因为我不知道integral2是如何工作的。但是如果你用简单的“sum(sum([([1,2,4],[3,-1,2])))”替换了integral2,那么它就可以按照预期的那样运行(也就是说,它总和了在x和y值上,结果是索引集上的矩阵。