0

私はMATLABで数値積分を使用しています.1つの変数を積分しますが、関数にはデータの次元に応じて可変数の項も含まれています。現在、2 次元の場合は次のようになります。

for t = 1:T  
   fxt = @(u)  exp(-0.5*(x(t,1)-theta*norminv(u,0,1)).^2) .* ...
         exp(-0.5*(x(t,2) -theta*norminv(u,0,1)).^2);
   f(t) = integral(fxt,1e-4,1-1e-4,'AbsTol',1e-3); 
end

次の用語のそれぞれに任意の数のデータポイントが存在する可能性があるという意味で、この関数を柔軟にしたいと思います。

exp(-0.5*(x(t,i) -theta*norminv(u,0,1)).^2);

これが理解できることを願っています。

4

2 に答える 2

0

ありがとうトロイですが、今私は次のことに出くわしました:

x = [0.3,0.8;1.5,-0.7];
T = size(x,1);
k  = size(x,2);
theta= 1;
fx = @(u,t,k) prod(exp(-0.5*(x(t,1:k) - theta*norminv(u,0,1))^2));
for t = 1,T
  f(t) = integral(@(u)fx(u,t,k),1e-4,1-1e-4,'AbsTol',1e-3);
end

使用エラー - マトリックスの次元は一致する必要があります。

@(u,t,k)prod(exp(-0.5*(x(t,1:k)-theta*norminv(u,0,1))^2)) のエラー

@(u)fx(u,t,k) のエラー

integralCalc/iterateScalarValued のエラー (314 行目) fx = FUN(t);

integralCalc/vadapt のエラー (133 行目) [q,errbnd] = iterateScalarValued(u,tinterval,pathlen);

integralCalc のエラー (76 行目) [q,errbnd] = vadapt(@AtoBInvTransform,interval);

積分エラー (89 行目) Q = integralCalc(fun,a,b,opstruct);

于 2014-10-23T22:22:32.603 に答える
0

xとが減算に対して有効な次元一致 (ベクトル-ベクトルまたは配列-スカラー) を持っている場合u、行列全体xをハンドルに入れintegral、名前とパラメーターのペア ( 'ArrayValued'true)を使用して関数に渡すことができます。

fxt = @(u)  exp(-0.5*(x - theta*norminv(u,0,1)).^2) .* ...
            exp(-0.5*(x - theta*norminv(u,0,1)).^2);
f   = integral(fxt,1e-4,1-1e-4,'AbsTol',1e-3,'ArrayValued',true);

ドキュメンテーション

integralベクトルuをハンドルに渡す場合は、ループが必要になる場合があります。しかし、integral関数がどのように記述されているかを見ると、統合ノードは配列値関数のスカラーとして入力されているため、奇妙な次元の不一致エラーがスローされない限り、ループは必要ありません。



配列値の出力

以下のコメントに応じて、次の関数ハンドルを試すことができます。

fx = @(u,t,k)  prod(exp(-0.5*(x(t,1:k)-theta*norminv(u,0,1)).^2),2);

次に、現在のループは次のようになります

fx = @(u,t,k) prod(exp(-0.5*(x(t,1:k)-theta*norminv(u,0,1)).^2),2);
k  = 2;
for t = 1:T
  f(t) = integral(@(u)fx(u,t,k),1e-4,1-1e-4,'AbsTol',1e-3,'ArrayValued',true);
end

寸法の不一致があるため、ArrayValuedフラグが必要です。この形式では、インデックスをスイープするために別のループが必要になります。ただし、モードを使用することでループの各反復が独立しているため、ループを完全にスキップすることでこの関数を改善できます。xukArrayValued

fx = @(u,k) prod(exp(-0.5*(x(:,1:k)-theta*norminv(u,0,1)).^2),2);
k  = 2;
f  = integral(@(u)fx(u,k),1e-4,1-1e-4,'AbsTol',1e-3,'ArrayValued',true);


ベクトル値の出力

が望ましくない場合ArrayValued(統合に多くの細分が必要で、ベクトル値uが望ましい場合など)、セル配列を使用してハンドルの再帰バージョンを試すこともできます。

% x has size [T,K]
fx = cell(K,1);
fx{1} = @(u,t) exp(-0.5*(x(t,1) - theta*norminv(u,0,1)).^2);
for k = 2:K
    fx{k} = @(u,t) fx{k-1}(u,t).*exp(-0.5*(x(t,k) - theta*norminv(u,0,1)).^2);
end

f(T) = 0;
k    = 2;
for t = 1:T
    f(t) = integral(@(u)fx{k}(u,t),1e-4,1-1e-4,'AbsTol',1e-3);
end
于 2014-10-23T20:10:35.407 に答える