2017-05-03 65 views
0

我想通过使用符号表示来评估Matlab中的三重积分。以下是我的代码:错误地计算三重积分象征

fun = @(x,y,z) (((2*pi)^length(data))*sqrt(det(COVAR)))^-1*exp(-0.5*([x y z]-OMEGA)'*inv(COVAR)*([x y z]-OMEGA)); 

q = integral3(fun,-Inf,Inf,-Inf,Inf,-Inf,Inf) 

上述功能是一个多变量高斯用3×3的协方差矩阵(COVAR)和10000x3样品,(数据)应理想地导致1.0作为其应答。

但它会导致错误信息... 矩阵尺寸必须一致。

错误@(X,Y,Z)EXP(-0.5 *([X,Y,Z] -OMEGA)” INV(COVAR)([X,Y,Z] -OMEGA))

(y,z)FUN(x(1)*(y,z)FUN(x(1)* ones(size(z)),y,z)(行138)中的误差

那些(大小(Z)),Y,Z),...

错误integral2Calc> @(Y)的乐趣(十一的人(大小(Y)),Y)(第18行) @(Y )fun(xi ones(size(y)),y),y1i,y2i,opstruct.integralOptions),...

integralCalc中的错误/ it erateScalarValued(line 314) fx = FUN(t);

integralCalc/vadapt(line 132)中的错误 [q,errbnd] = iterateScalarValued(u,tinterval,pathlen); (行103) [q,errbnd] = vadapt(@ minusInfToInfInvTransform,interval);在integral2Calc> @(XI,y1i,y2i)integralCalc

误差(@(y)的乐趣(XI *酮(大小(Y)),y)的,y1i,y2i,opstruct.integralOptions)

错误(@)(y),y1i,y2i,opstruct.integralOptions),x,ymin (x)中,YMAX(X)) (第17行) innerintegral = @(X)arrayfun(@(XI,y1i,y2i)integralCalc(...

错误integralCalc/iterateScalarValued(线314) fx = FUN(t);

在integralCalc/vadapt(line 132) [q,errbnd] = iterateScalarValued(u,tinterval,pathlen); (行103) [q,errbnd] = vadapt(@ minusInfToInfInvTransform,interval);积分2积分(积分20)中的误差 [q,errbnd] =积分积分(积分积分,xmin,xmax,opstruct.integralOptions);

integral2Calc中的错误(第7行) [q,errbnd] = integral2i(fun,xmin,xmax,ymin,ymax,optiontruct);

Integral3 /内积分(线137)中的错误 Q1 = integral2Calc(...

integralCalc/iterateScalarValued中的错误(第314行) fx = FUN(t);

integralCalc/vadapt(line 132)中的错误 [q,errbnd] = iterateScalarValued(u,tinterval,pathlen); (行103) [q,errbnd] = vadapt(@ minusInfToInfInvTransform,interval);

积分3(第121行)中的错误 Q = integralCalc(@ innerintegral,xmin,xmax,integralOptions);

我不太明白错误信息,任何帮助将不胜感激。先谢谢你。

其实,我想在计算仅第一象限的函数值....

q = integral3(fun,0,Inf,0,Inf,0,Inf) %%something like this. 

这项工作背后的想法是计算,如果我们上述多元分布的标准化常数碰巧只限于正面参数/估计值。

谢谢。

回答

0

假设COVAR是3×3 ......你有1×3,1×3×3 *:

([x y z]-OMEGA)'*inv(COVAR) 

这将导致1×3。然后,你尝试乘以另一个1x3:

*([x y z]-OMEGA) 

所以内部尺寸是3和1(不同意)。

+0

亲爱的Mike C.我很感谢你的回答。感谢您指出这个微不足道的错误。但我没有解决原来的问题。你可以看看错误信息吗?在我看来,integral3无法处理'数组选项'。 –

+0

您尝试了积分3(fun,-Inf,Inf,-Inf,Inf,-Inf,Inf,'ArrayValued','true')吗? –

+0

我尝试了integral3,但它似乎没有针对阵列输入的规定。在为多元高斯试图嵌套int 3次并限制[-Inf,Inf]为所有变量后,我能够恢复所需的结果,即。 1.0。但是,当所有3个变量的限制都是[0,Inf]时,代码需要很长时间... –

0

我认为我输入的顺序正确,但我得到了一个不同的错误。在我看来,integral3无法处理'数组选项'。使用integralCalc/finalInputChecks(线515)的功能的 输出

fun = @(x,y,z) (((2*pi)^length(data))*sqrt(det(COVAR)))^-1*exp(-0.5*[x-OMEGA(1);y-OMEGA(2);z-OMEGA(3)]'*inv(COVAR)*[x-OMEGA(1);y-OMEGA(2);z-OMEGA(3)]) 

q = integral3(fun,-Inf,Inf,-Inf,Inf,-Inf,Inf) 

误差必须的尺寸与输入相同。如果FUN是一个数组值,则将'ArrayValued'选项设置为true。

integralCalc/iterateScalarValued中的错误(行315) finalInputChecks(x,fx);

integralCalc/vadapt(line 132)中的错误 [q,errbnd] = iterateScalarValued(u,tinterval,pathlen); (行103) [q,errbnd] = vadapt(@ minusInfToInfInvTransform,interval);在integral2Calc> @(XI,y1i,y2i)integralCalc

误差(@(y)的乐趣(XI *酮(大小(Y)),y)的,y1i,y2i,opstruct.integralOptions)

错误(@)(y),y1i,y2i,opstruct.integralOptions),x,ymin (x),y​​max(x)) (line 17) innerintegral = @(x)arrayfun(@(xi,y1i,y2i)integralCalc(...

integralCalc/iterateScalarValued中的错误(第314行) fx = FUN(t);

integralCalc/vadapt(line 132)中的错误 [q,errbnd] = iterateScalarValued(u,tinterval,pathlen); (行103) [q,errbnd] = vadapt(@ minusInfToInfInvTransform,interval);积分2积分(积分20)中的误差 [q,errbnd] =积分积分(积分积分,xmin,xmax,opstruct.integralOptions);

integral2Calc中的错误(第7行) [q,errbnd] = integral2i(fun,xmin,xmax,ymin,ymax,optiontruct);

错误integralCalc /;

在integral3/innerintegral(线137) Q1 = integral2Calc(...

错误integralCalc/iterateScalarValued(线314) FX = FUN(t)的误差vadapt(线132) [q,errbnd] = iterateScalarValued(U,tinterval,pathLen不能);

错误integralCalc(线103) [q,errbnd] = vadapt(@ minusInfToInfInvTransform,间隔);

积分3中的错误(第121行) Q = integralCalc(@ innerintegral,xmin,xmax,integralOptions);