2012-02-18 38 views
5

変数の数が制約の数を超える(または時々逆の)非線形問題を解決しなければならないことがよくあります。通常、制約や変数のいくつかは複雑な方法で冗長です。このような問題を解決する方法はありますか?制約のないシステムに対する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()からの戻り配列のサイズを変更する方法

+0

は、これは本当にscipyのダウンロード質問であるか、それが実際に偽の髭を身に着けている数学的なものですか? – talonmies

+0

私はそれが怖い質問だと信じています。私が書いたカスタムソルバを使って、これらのタイプの問題を解決することはできますが、既存のscipyソルバを使用できるようにすることができます。さらに、matlabのfsolveはこれらを解決できるようです。これは一般的な状況のようで、scipyがそれを(一見)扱うことができないと考えるのは難しいです。 –

+0

'fsolve'は信頼領域メソッドIIRCを使用します。だからあなたは本当に 'fsolve'に類似のscipy関数があるかどうかを知りたがっていますか? – talonmies

答えて

3

import numpy as np 
import scipy.optimize 

mat = np.random.randn(5, 7) 

def F(x): 
    y = np.dot(mat, x) 
    return np.resize(np.array([ y[0]**2 + y[1]**3 + 12, y[2] + 17]), 7) 

while True:  
    x0 = np.random.randn(7) 
    r = scipy.optimize.leastsq(F, x0) 
    err = F(r[0]) 
    norm = np.dot(err, err) 
    if norm < 1e-6: 
     break 

print err 
+0

ありがとう、これは動作するようです。これが自動的に行われない理由はありますか?おそらく副作用がなければ、私はサイフィーのパッチとして自動パディングを提案するでしょう。 –

関連する問題