Estoy tratando de evaluar una triple integración en Matlab, mediante el uso de representación simbólica. El siguiente es mi código:

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) 

La función anterior es una gaussiana multivariada con una matriz de covarianza de 3x3 (COVAR) y una muestra de 10000x3, (los datos) idealmente deberían dar como resultado 1.0 como respuesta.

Pero da como resultado mensajes de error ... Las dimensiones de la matriz deben estar de acuerdo.

Error en @ (x, y, z) exp (-0.5 * ([x, y, z] -OMEGA) ' inv (COVAR) ([x, y, z] -OMEGA))

Error en integral3> @ (y, z) FUN (x (1) * ones (size (z)), y, z) (línea 138) @ (y, z) FUN (x (1) * ones (size ( z)), y, z), ...

Error en integral2Calc> @ (y) fun (xi ones (size (y)), y) (línea 18) @ (y) fun (xi ones (size (y)), y), y1i, y2i, opstruct.integralOptions), ...

Error en integralCalc / iterateScalarValued (línea 314) fx = FUN (t);

Error en integralCalc / vadapt (línea 132) [q, errbnd] = iterateScalarValued (u, tinterval, pathlen);

Error en integralCalc (línea 103) [q, errbnd] = vadapt (@ minusInfToInfInvTransform, intervalo);

Error en integral2Calc> @ (xi, y1i, y2i) integralCalc (@ (y) fun (xi * ones (size (y)), y), y1i, y2i, opstruct.integralOptions)

Error en integral2Calc> @ (x) arrayfun (@ (xi, y1i, y2i) integralCalc (@ (y) fun (xi * ones (size (y)), y), y1i, y2i, opstruct.integralOptions), x, ymin (x), ymax (x)) (línea 17) innerintegral = @ (x) arrayfun (@ (xi, y1i, y2i) integralCalc (...

Error en integralCalc / iterateScalarValued (línea 314) fx = FUN (t);

Error en integralCalc / vadapt (línea 132) [q, errbnd] = iterateScalarValued (u, tinterval, pathlen);

Error en integralCalc (línea 103) [q, errbnd] = vadapt (@ minusInfToInfInvTransform, intervalo);

Error en integral2Calc> integral2i (línea 20) [q, errbnd] = integralCalc (innerintegral, xmin, xmax, opstruct.integralOptions);

Error en integral2Calc (línea 7) [q, errbnd] = integral2i (diversión, xmin, xmax, ymin, ymax, optionstruct);

Error en integral3 / innerintegral (línea 137) Q1 = integral2Calc (...

Error en integralCalc / iterateScalarValued (línea 314) fx = FUN (t);

Error en integralCalc / vadapt (línea 132) [q, errbnd] = iterateScalarValued (u, tinterval, pathlen);

Error en integralCalc (línea 103) [q, errbnd] = vadapt (@ minusInfToInfInvTransform, intervalo);

Error en integral3 (línea 121) Q = integralCalc (@ innerintegral, xmin, xmax, integralOptions);

No entiendo bien los mensajes de error y agradeceré cualquier ayuda. Gracias de antemano.

En realidad, me gustaría calcular el valor de la función solo en el primer cuadrante ...

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

La idea detrás de este ejercicio es calcular la constante de normalización para la distribución multivariante anterior si nos limitamos a los parámetros positivos / valores estimados solamente.

Gracias.

0
Abhishek Parida 3 may. 2017 a las 15:21

2 respuestas

La mejor respuesta

Suponiendo que COVAR es un 3x3 ... tiene un 1x3 * 3x3 en:

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

Esto da como resultado un 1x3. Luego, intentas multiplicar por otro 1x3:

*([x y z]-OMEGA)

Entonces las dimensiones internas son 3 y 1 (no estoy de acuerdo).

0
Mike C 3 may. 2017 a las 18:24

Creo que estoy ingresando la secuencia correctamente, pero obtengo un error diferente. Me parece que integral3 no podría manejar las 'opciones con valores de matriz'.

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) 

Error al usar integralCalc / finalInputChecks (línea 515) La salida de la función debe ser del mismo tamaño que la entrada. Si FUN es un integrando con valor de matriz, establezca la opción 'ArrayValued' en verdadero.

Error en integralCalc / iterateScalarValued (línea 315) finalInputChecks (x, fx);

Error en integralCalc / vadapt (línea 132) [q, errbnd] = iterateScalarValued (u, tinterval, pathlen);

Error en integralCalc (línea 103) [q, errbnd] = vadapt (@ minusInfToInfInvTransform, intervalo);

Error en integral2Calc> @ (xi, y1i, y2i) integralCalc (@ (y) fun (xi * ones (size (y)), y), y1i, y2i, opstruct.integralOptions)

Error en integral2Calc> @ (x) arrayfun (@ (xi, y1i, y2i) integralCalc (@ (y) fun (xi * ones (size (y)), y), y1i, y2i, opstruct.integralOptions), x, ymin (x), ymax (x)) (línea 17) innerintegral = @ (x) arrayfun (@ (xi, y1i, y2i) integralCalc (...

Error en integralCalc / iterateScalarValued (línea 314) fx = FUN (t);

Error en integralCalc / vadapt (línea 132) [q, errbnd] = iterateScalarValued (u, tinterval, pathlen);

Error en integralCalc (línea 103) [q, errbnd] = vadapt (@ minusInfToInfInvTransform, intervalo);

Error en integral2Calc> integral2i (línea 20) [q, errbnd] = integralCalc (innerintegral, xmin, xmax, opstruct.integralOptions);

Error en integral2Calc (línea 7) [q, errbnd] = integral2i (diversión, xmin, xmax, ymin, ymax, optionstruct);

Error en integral3 / innerintegral (línea 137) Q1 = integral2Calc (...

Error en integralCalc / iterateScalarValued (línea 314) fx = FUN (t);

Error en integralCalc / vadapt (línea 132) [q, errbnd] = iterateScalarValued (u, tinterval, pathlen);

Error en integralCalc (línea 103) [q, errbnd] = vadapt (@ minusInfToInfInvTransform, intervalo);

Error en integral3 (línea 121) Q = integralCalc (@ innerintegral, xmin, xmax, integralOptions);

0
Abhishek Parida 3 may. 2017 a las 18:02