2017-04-25 14 views
1

積分の無限の限界を持つ一定の積分の数値計算を含む数式を使用してデータに適合させようとしています。フィッティングのために、ベクトル化モデル関数を必要とするオクターブ関数leasqrを使用します。次のコードは、数値積分を呼び出すときに発生するエラーを生成します。関数のベクトル化には、オクターブ単位での積分の数値計算が含まれています

不適合の引数(OP1は1x387で、OP2が10x2ではある)

function [fGsAb] = GsAbs (x, p) 
Hw = 3108.0 ; 
fGsAb = Hw ./ (2.4 .* p(1) .*p(2)) .^2 .* (exp (- (Hw - p(1) .* x) .^2 ... 
./ (2.4 .* p(1) .*p(2)) .^2) - exp (- (Hw + p(1) .* x) .^2 ... 
./ (2.4 .* p(1) .*p(2)) .^2)) ; 
endfunction 
function [GsDisp] = gauss_disp(x, p) 
[GsDisp1, err] = quadgk (@(z) GsAbs(z, p) ./(z-x), - inf, x - 0.000001); 
[GsDisp2, err] = quadgk (@(z) GsAbs(z, p) ./(z-x), x + 0.000001 , inf ); 
GsDisp = GsDisp1 +GsDisp2; 
endfunction  
h = [200:15:6000]; 
pin =[1 250]; 
dd = gauss_disp (h, pin); 

私はループ使用している場合:私はエラーを持っていませんが、私はこの構造を使用することはできません

for i = 1 : length (h) 
dd (i) = gauss_disp (h (i), pin) 
endfor 

leasqr。この制限を回避するにはどうすればよいですか?

ありがとうございます!

+0

質問は不明です。これらの関数をファイルで定義していますか?またはオクターブの端子で直接?そしてどのラインがあなたにこのエラーを与えていますか? –

+1

私はあなたの問題を回避する答えを提供しました。しかし、将来、 'leasqr'が' optim'パッケージからの関数であるというような関連情報をすべて提供してください。そして、これは特定のフォームの機能を期待するので、これは失敗します。私は自分自身を推測するために妥当な量の探偵活動をしなければならなかった。 –

答えて

1
このことから、あなたのgauss_disp.mファイルを変更し

function [GsDisp] = gauss_disp(x, p) 
    [GsDisp1, err] = quadgk (@(z) GsAbs(z, p) ./(z-x), - inf, x - 0.000001); 
    [GsDisp2, err] = quadgk (@(z) GsAbs(z, p) ./(z-x), x + 0.000001 , inf ); 
    GsDisp = GsDisp1 +GsDisp2; 
endfunction 

これに:

function [GsDisp] = gauss_disp(x, p) 
    GsDisp = arrayfun(@(z) gauss_disp_elementwise(z, p), x) 
endfunction 

function GsDisp = gauss_disp_elementwise(x, p) 
    [GsDisp1, err] = quadgk (@(z) GsAbs(z, p) ./(z-x), - inf, x - 0.000001); 
    [GsDisp2, err] = quadgk (@(z) GsAbs(z, p) ./(z-x), x + 0.000001 , inf ); 
    GsDisp = GsDisp1 +GsDisp2; 
endfunction 

すなわち、元の関数をスカラー値のみを扱うヘルパーサブ関数にしてからarrayfunでそれを使って、xの全範囲の出力を得る。あなたはleasqr機能でこれを使用することができます。この方法で、例えば:

y = leasqr(h, dd, pin, @gauss_disp); 

PS:arrayfun構文は、単に便宜のためです。代わりにあなたの質問に使用したものと同様のforループを簡単に使用できました。

+1

その最高の進歩:-) +1 – Andy

+0

@アンディ私はただ論文を提出したので、許可されました。 –

+0

ありがとう、私が探していたフィッティング関数のそのようなパッケージング。私は 'for'ループは 'leasqr'にとって役に立たないと思う。 – Igor

関連する問題