我做了一个函数来采用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
有人帮助我吗?
答案 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: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) ;
我插入了一些换行符(...
)以便于阅读:)
我不确定这是否会为您带来可靠的结果,因为从-Inf
到Inf
的整合:在documentation of quad中,声明
如果间隔是无限的,[a,Inf],那么对于fun(x)的积分存在,fun(x)必须在x接近无穷大时衰减
所以,你必须确保是这种情况,否则你将继续NaNs