Matlab のルート検索問題で十分な精度を達成するのに苦労しています。関数 があり、 whereLik(k)
の値を見つけたいと考えています。基本的に、問題は、さまざまな組み込みの Matlab ソルバー ( 、、) が、私が望む、または期待するほど解に近づいていないことです。k
Lik(k)=L0
fzero
fminbnd
fmincon
Lik()
は、数値逆ラプラス変換などを計算するための広範なコーディングを伴うユーザー定義関数であるため、完全なコードは含めません。しかし、私はこの機能を広範囲に使用しており、適切に機能しているようです。 Lik()
は実際にはいくつかの入力パラメーターを取りますが、現在のステップでは、これらは を除いてすべて固定されてk
います。したがって、これは実際には 1 次元の求根問題です。
k >= 165.95
whichの値を見つけたいですLik(k)-L0 = 0
。Lik(165.95)
よりも小さく、ここから単調に増加するL0
と予想しています。Lik(k)
実際、Lik(k)-L0
関心のある範囲で評価でき、スムーズにゼロを横切るように見えますLik(165.95)-L0 = -0.7465, ..., Lik(170.5)-L0 = -0.1594, Lik(171)-L0 = -0.0344, Lik(171.5)-L0 = 0.1015, ... Lik(173)-L0 = 0.5730, ..., Lik(200)-L0 = 19.80
。したがって、関数は適切に動作しているように見えます。
ただし、いくつかの異なる方法でルートを「自動的に」見つけようとしましたが、精度は期待したほど良くありません...
Using fzero(@(k) Lik(k)-L0)
: interval に制約されている場合は(165.95,173)
、 を返しfzero
ます。さて、素晴らしいことではありませんが。そして実用的な目的のために、多くの手作業による試行錯誤がなければ、そのような正確な上限を知ることはできません. interval を使用すると、where が返されますが、これはかなり貧弱です。Displayをiterに設定してこれらのテストを実行したので、何が起こっているのかがわかります。4 回目の反復でヒットし、5 回目の反復でそこにとどまっているように見えます。つまり、1 つの反復から次の反復への変化が少ないことを意味します。よりもk=170.96
Lik(k)-L0=-0.045
(165.95,200)
fzero
k=167.19
Lik(k)-L0 = -0.65
fzero
167.19
k
TolX
(0.001 に設定) し、手順は終了します。終了フラグは、解に正常に収束したことを示します。
また、 ( の上限と下限を指定) と( の開始点を指定)abs(Lik(k)-L0)
を使用して最小化を試みたところ、同様の精度の問題が発生しました。特に、 との両方を設定できますが、これら (10^-6 まで下げると、必要以上に高い精度) をいじっても、違いはありませんでした。紛らわしいことに、オプティマイザーは、以前の反復で、返される最終的な k 値よりも目的関数をゼロにすることに近い k 値を見つけることさえあります。fminbnd
k
fmincon
k
fmincon
TolX
TolFun
そのため、アルゴリズムは特定のポイントまで反復しているように見えますが、より良い解決策を見つけるのに十分なサイズのステップをそれ以上実行できません。アルゴリズムが別の大きな一歩を踏み出さない理由を誰か知っていますか? これを変更するために調整できるものはありますか?( optimsetの下のリストを見ましたが、有用なものは何も思いつきませんでした。)
どうもありがとう!