1

積分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を使用するなどして、任意の2つのベクトルを入力として受け取ることで解決できます。

あなたの問題のために、これはこのように行われます:

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クワッドのドキュメントでは、次のように述べられています

区間が無限大[a、Inf)の場合、fun(x)の積分が存在するためには、xが無限大に近づくにつれてfun(x)が減衰する必要があります。

したがって、これが当てはまるかどうかを確認する必要があります。そうしないと、取得し続けることになりますNaNs

于 2012-05-11T11:01:23.340 に答える