以符号方式计算三重积分时出错

时间:2017-05-03 12:21:10

标签: matlab

我试图通过使用符号表示来评估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) 

上述函数是具有3x3协方差矩阵(COVAR)和10000x3样本的多变量高斯函数,(数据)理想情况下应该导致1.0作为其答案。

但它导致错误消息...... 矩阵维度必须一致。

@(x,y,z)exp(-0.5 *([x,y,z] -OMEGA)' inv(COVAR)([x,y,z] - 的错误 - OMEGA))

积分3中的错误> @(y,z)FUN(x(1)* 1(size(z)),y,z)(第138行)             @(y,z)FUN(x(1)* ones(size(z)),y,z),...

integral2Calc中的错误> @(y)fun(xi 1(size(y)),y)(第18行)     @(y)fun(xi ones(size(y)),y),y1i,y2i,opstruct.integralOptions),...

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

integralCalc / vadapt出错(第132行)             [q,errbnd] = iterateScalarValued(u,tinterval,pathlen);

integralCalc出错(第103行)         [q,errbnd] = vadapt(@ minusInfToInfInvTransform,interval);

integral2Calc中的错误> @(xi,y1i,y2i)integralCalc(@(y)fun(xi * ones(size(y)),y),y1i,y2i,opstruct.integralOptions)

integral2Calc中的错误> @(x)arrayfun(@(xi,y1i,y2i)integralCalc(@(y)fun(xi * ones(size(y)),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出错(第132行)             [q,errbnd] = iterateScalarValued(u,tinterval,pathlen);

integralCalc出错(第103行)         [q,errbnd] = vadapt(@ minusInfToInfInvTransform,interval);

integral2Calc中的错误> integral2i(第20行) [q,errbnd] = integralCalc(innerintegral,xmin,xmax,opstruct.integralOptions);

integral2Calc出错(第7行)     [q,errbnd] = integral2i(fun,xmin,xmax,ymin,ymax,optionstruct);

integral3 / innerintegral中的错误(第137行)         Q1 = integral2Calc(...

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

integralCalc / vadapt出错(第132行)             [q,errbnd] = iterateScalarValued(u,tinterval,pathlen);

integralCalc出错(第103行)         [q,errbnd] = vadapt(@ minusInfToInfInvTransform,interval);

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

我不太了解错误消息,任何帮助将不胜感激。提前谢谢。

实际上,我想仅计算第一象限中的函数值....

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

这个练习背后的想法是,如果我们恰好仅限于正参数/估计值,则计算上述多变量分布的归一化常数。

谢谢。

2 个答案:

答案 0 :(得分:0)

假设COVAR是3x3 ......你有1x3 * 3x3:

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

这导致1x3。然后,您尝试乘以另一个1x3:

*([x y z]-OMEGA)

因此内部维度为3和1(不同意)。

答案 1 :(得分:0)

我认为我正确地输入了序列,但是我得到了一个不同的错误。在我看来,integral3无法处理'数组值选项'。

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) 

使用integralCalc / finalInputChecks时出错(第515行) 函数的输出必须与输入的大小相同。如果FUN是一个数组值的被积函数,请将'ArrayValued'选项设置为true。

integralCalc / iterateScalarValued中的错误(第315行)                 finalInputChecks(X,FX);

integralCalc / vadapt出错(第132行)             [q,errbnd] = iterateScalarValued(u,tinterval,pathlen);

integralCalc出错(第103行)         [q,errbnd] = vadapt(@ minusInfToInfInvTransform,interval);

integral2Calc中的错误> @(xi,y1i,y2i)integralCalc(@(y)fun(xi * ones(size(y)),y),y1i,y2i,opstruct.integralOptions)

integral2Calc中的错误> @(x)arrayfun(@(xi,y1i,y2i)integralCalc(@(y)fun(xi * ones(size(y)),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出错(第132行)             [q,errbnd] = iterateScalarValued(u,tinterval,pathlen);

integralCalc出错(第103行)         [q,errbnd] = vadapt(@ minusInfToInfInvTransform,interval);

integral2Calc中的错误> integral2i(第20行) [q,errbnd] = integralCalc(innerintegral,xmin,xmax,opstruct.integralOptions);

integral2Calc出错(第7行)     [q,errbnd] = integral2i(fun,xmin,xmax,ymin,ymax,optionstruct);

integral3 / innerintegral中的错误(第137行)         Q1 = integral2Calc(...

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

integralCalc / vadapt出错(第132行)             [q,errbnd] = iterateScalarValued(u,tinterval,pathlen);

integralCalc出错(第103行)         [q,errbnd] = vadapt(@ minusInfToInfInvTransform,interval);

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