2016-12-05 19 views
0

MatlabとPythonのdog-leg信頼領域アルゴリズムを使用して非線形方程式を解いています。MatlabとPythonの最適化アルゴリズム(dog-leg trust-region)

Matlabにはfsolveがあります。このアルゴリズムはデフォルトですが、Pythonではscipy.optimize.minimizeに 'dogleg'を指定しています。 MatlabにはJacobianとHessianを指定する必要はありませんが、Pythonでは問題を解決するためにどちらか一方が必要です。

私はヤコビアン/ヘッセンを持っていないので、この問題を回避する方法はありますか?または、fsolveにMatlabのdog-legメソッドに相当する機能を実行する別の関数がありますか?

答えて

2

scipyの新しいバージョンには、approx_fprimeという機能があります。 fowardステップの有限差分を使用して、位置xkの関数fのジャコビアンの数値近似を計算します。これは位置xkに部分的に派生したfのndarrayを返します。

あなたのバージョンのscipyをアップグレードできない場合は、いつでも実装をscipy's sourceからコピーできます。


編集:

scipy.optimize.minimize入力jac=False場合、内部でapprox_fprimeを呼び出します。だからあなたの場合には、次のことを行うのに十分でなければなりません:

scipy.optimize.minimize(fun, x0, args, method='dogleg', jac=False) 

編集

scipyapprox_fprimeを使用して呼び出し可能jacを構築する必要があるので、適切jac=False条件を処理していないようです

jac = lambda x,*args: scipy.optimize.approx_fprime(x,fun,epsilon,*args) 
scipy.optimize.minimize(fun, x0, args, method='dogleg', jac=jac) 
+0

はい、あなたは正しいです!私に気付かせてくれてありがとう。私は自分の答えを編集し、 'approx_fprime'を' jac = False'の内部で '' approx_fprime''を呼び出す部分を追加しました。 – lucianopaz

+0

'jac = False'を指定するとエラーになります:' ValueError:Jacobianはdogleg最小化に必要です ' –

+0

scipyが[数値推定](https://github.com/scipy/scipy/blob/v0.18.0/scipy/optimize/_minimize.py#L411-L416)の処理に誤りがあるようです。このエラーはscipyの現在のバージョンでは残っているので、バグのチケットなどを置く必要があるようです。あなたの特定の問題を解決するには、 'approx_fprime'を使って呼び出し可能な' jac'を構築する必要があります。私はそれに応じて私の答えを編集しました。 – lucianopaz

関連する問題