1

我做了一个函数来获取 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

有人帮我吗?

4

1 回答 1

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:5并且4: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) ;

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

评论

我不确定这是否会为您带来可靠的结果,因为集成 from -Infto Inf: 在quad 的文档中,据说

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

所以,你必须确保是这种情况,否则你会不断得到NaNs

于 2012-05-11T11:01:23.340 回答