変数の数が制約の数を超える(または時々逆の)非線形問題を解決しなければならないことがよくあります。通常、制約や変数のいくつかは複雑な方法で冗長です。このような問題を解決する方法はありますか?制約のないシステムに対するSciPyの最適化
ほとんどのscipyソルバーは、制約の数が変数の数に等しいと仮定し、ヤコビアンは非特異的であると仮定しているようです。 leastsq
は時には動作しますが、制約が変数の数よりも少ない場合にも試しません。 linalg.norm(F)
にfmin
を実行することができますが、これはヤコビ行列を使用するどの方法よりも効率が低いです。
ここでは、私が何を話しているかを示す問題の例を示します。明らかに解決策がありますが、leastsq
にエラーがあります。もちろん、この例は手で簡単に解決できますが、ここではその問題を示すためにここに示します。
import numpy as np
import scipy.optimize
mat = np.random.randn(5, 7)
def F(x):
y = np.dot(mat, x)
return np.array([ y[0]**2 + y[1]**3 + 12, y[2] + 17 ])
x0 = np.random.randn(7)
scipy.optimize.leastsq(F, x0)
私が取得エラーメッセージは次のとおりです。
Traceback (most recent call last):
File "question.py", line 13, in <module>
scipy.optimize.leastsq(F, x0)
File "/home/dstahlke/apps/scipy/lib64/python2.7/site-packages/scipy/optimize/minpack.py", line 278, in leastsq
raise TypeError('Improper input: N=%s must not exceed M=%s' % (n,m))
TypeError: Improper input: N=7 must not exceed M=2
私は答えのためにネットを精練しているとさえscipyのダウンロードのメーリングリストで尋ねると、何の応答を得ませんでした。今のところ私はSciPyソースをハックしてnewton_krylov
ソルバがpinv()
を使用するようにしましたが、これは最適な解決策ではないと私は考えています。変数の数にF()からの戻り配列のサイズを変更する方法
は、これは本当にscipyのダウンロード質問であるか、それが実際に偽の髭を身に着けている数学的なものですか? – talonmies
私はそれが怖い質問だと信じています。私が書いたカスタムソルバを使って、これらのタイプの問題を解決することはできますが、既存のscipyソルバを使用できるようにすることができます。さらに、matlabのfsolveはこれらを解決できるようです。これは一般的な状況のようで、scipyがそれを(一見)扱うことができないと考えるのは難しいです。 –
'fsolve'は信頼領域メソッドIIRCを使用します。だからあなたは本当に 'fsolve'に類似のscipy関数があるかどうかを知りたがっていますか? – talonmies