2017-02-07 8 views
0

Matlabでfzeroを使って数値的に方程式を解いてみようとしています。それはより大きな運動の一部です。私はここにはあまり掲載していないので、あなたはこの練習について必要な背景情報がどれほどであるか分かりませんので、それを短くしてください。ガンマパラメータ推定を数値的に解く

これは私のコードです:

fun = @(a)log(a/xBar) + (1/n) * log(dataProd) + diff(gamma(a))/gamma(a); 
x0 = 0.8014; 
x = fzero(fun,x0) 

は、これらは、値は次のとおりです。 のn = 209 XBARは0.6078 dataProd = 3.1554e-77

である私は、MATLABで次のエラーメッセージを取得:

|| & &演算子は、論理 スカラー値に変換可能でなければなりません。関数fzeroで

エラー(ライン306)

のelseif〜isfiniteの(FX)|| 〜isreal(fx)

なぜこのエラーメッセージが表示されるのですか?

+0

あなたには「diff」とは何ですか? 'diff'は配列内の隣接する値の差を計算するためです。 1値配列の値の違いは、「存在しない」または「[]」なので、diff(gamma(a))は '[]'です。これは、 'a'が単一の値であるときに' fun(a) 'を返す' [] 'とします。この' fzero'は失敗します。実際には 'fun'は単一の値に対してのみ定義されているので、常に' [] 'を返します –

+1

' diff'の意味がガンマ関数の派生である場合は、Matlab関数 'psi'を見てください。これを使ってガンマの導関数を計算することができます。しかし、あなたがしようとしていることがわからないので、これは単なる推測です。 – Florian

+0

私はこのページを見ていました:https://se.mathworks.com/help/symbolic/differentiation.html。だから私はdiffが関数の差別化だと思ったのです。だから、私が欲しいのは、ガンマをガンマで割った点のガンマの導関数です。私はこれがpsi(a)であるように思えます。 diff(gamma(a))/ gamma(a)をpsi(a)に変更しました。ありがとう:) –

答えて

0

解決策の検索中、fzeroは、関数がa = 0で評価され、無限大に至ると推測します。この場合を調べるには、最適化パラメータ 'display'を 'iter'に設定するか、ご使用のMatlabのバージョンに類似するものを表示するかどうかを確認してください。それ以外の場合は、関数を別のmファイルに移動し、最初の行でdisp(a)を呼び出すだけです。そうすれば、fzeroが何をしているのか、そしてどの値が問題を引き起こしているのかを見ることができます。

関連する問題