在Matlab中取一个积分的功能

时间:2012-05-11 10:16:25

标签: matlab

我做了一个函数来采用intergal Likehood(L,U,gamma,sigma),但是有一些错误。 这是我的Matlab代码。

function func=Likelihook(L,U,gamma,sigma)
Lstar=3;
Ustar=20;
gammastar=1.5;
a=0.2;
func=-0.5.*log(2.*pi)-log(sigma)+log(gamma)-log(L.^(-gamma)-U.^(-gamma))+quad(@(y)(log(quad(@(x)(x.^(-gamma-1).*exp(-0.5.*((y-x)./sigma).^2)),L,U)).*gammastar./(sqrt(2*pi).*Lstar.^(-gammastar)-Ustar.^(-gammastar)).*quad(@(x)(x.^(-gammastar-1)./(a.*x).*exp(-0.5.*((y-x)./(a.*x)).^2)),Lstar,Ustar)),-inf,inf) ;

这是我想要计算的功能

http://i.stack.imgur.com/lP1lz.png

有人帮助我吗?

1 个答案:

答案 0 :(得分:3)

说明

Matlab尝试矢量计算积分,所以

f = @(x) x;
quad(f(x) x,1,5)

得到像

一样的评估
sum(f(1:dx:5))

用matlab确定离散化间隔应该是什么。 这是可计算的,因为f = @(x) x需要矢量输入。

当你有双积分时,你会得到这样的东西:

f = @(x,y) x+y;
quad(quad(f(x,y) x,1,5),4:10)

变为

sum(sum(f(1:dx:5,),4:dy:10))

这只会评估1:dx:54:dy:10是否恰好具有相同数量的元素(不太可能)。

解决方案

当然,您可以通过调整函数f来解决它,因此它会将任意两个向量作为输入,例如使用arrayfun。

对于您的问题,这样做是这样的:

func = -0.5.*log(2.*pi)-log(sigma)+log(gamma)-log(L.^(-gamma)-U.^(-gamma)) ...
+quad(@(y)( ...
    log( arrayfun(@(z) quad(@(x)( x.^(-gamma-1).*exp(-0.5.*((z-x)./sigma).^2)),L,U), y) ) ...
    .* gammastar./(sqrt(2*pi).*Lstar.^(-gammastar)-Ustar.^(-gammastar)) ...
    .* arrayfun(@(z) quad(@(x)( x.^(-gammastar-1)./(a.*x).*exp(-0.5.*((z-    x)./(a.*x)).^2)),Lstar,Ustar), y) ...
),-inf,inf) ;

我插入了一些换行符(...)以便于阅读:)

说明

我不确定这是否会为您带来可靠的结果,因为从-InfInf的整合:在documentation of quad中,声明

如果间隔是无限的,[a,Inf],那么对于fun(x)的积分存在,fun(x)必须在x接近无穷大时衰减

所以,你必须确保是这种情况,否则你将继续NaNs