2016-04-18 43 views
7

私は自分のニュートンラフソンアルゴリズムをPythonでsympynumpyを使って書いています。numpyで行列の方程式を解く

コードは以下の通りですが、あなたはこれを無視し、エラーへスキップすることができます。

CODE

def newtonRhapson(fncList, varz, x0): 

    jacob = [] 

    for fnc in fncList: 
     vec = [] 
     for var in varz: 
      res = fnc.diff(var) 
      for i in range(len(varz)): 
       res = res.subs(varz[i], x0[i]) 
      vec.append(res) 
     jacob.append(numpy.array(vec, dtype='float64')) 

    fx0=[] 

    for fnc in fncList: 
     res2 = fnc 
     for i in range(len(varz)): 
      res2 = res2.subs(varz[i], x0[i]) 
     fx0.append(res2) 

    j = jacob 
    f = fx0 

    print j 
    print '' 
    print f 

    print numpy.linalg.solve(j,f).tolist() 

関数の引数は次のとおりです。

​​- PythonのリストSympy記号を使用する関数の数:

varz - これらの記号を含むリストは、(変数)

x0 - 我々printjf時点まで初期推測

ERROR

それが正常に動作し、次のように出力されます

[array([-9.13378682, -5.91269838]), array([ 4.84401379, 1.01980286])] 

[-5.15598620617611, 5.13378681611922] 

実行時:

しかしラインを実行している上:

print numpy.linalg.solve(j,f).tolist() 

私はエラーを取得する:

File "/Users/me/anaconda/lib/python2.7/site- packages/numpy/linalg/linalg.py", line 384, in solve 
r = gufunc(a, b, signature=signature, extobj=extobj) 
TypeError: No loop matching the specified signature and casting was found for ufunc solve1 

答えて

5

あなたの問題はあなたの第二forのループです。

for fnc in fncList: 
    res2 = fnc 
    for i in range(len(varz)): 
     res2 = res2.subs(varz[i], x0[i]) 
    fx0.append(res2) 

あなたはfx0に追加するとき、あなたは(が詳細ためthis answerを参照)numpyのは、LAPACKを使用してシステムの決定を計算することができるように、同じタイプ(float64)を追加していることを確認する必要があります。 <class 'sympy.core.numbers.Float'>を現在追加しています - 誤ったタイプの署名が使用されているというエラーメッセージが表示されます。この問題を修正するには

あなたはもちろん

for fnc in fncList: 
    res2 = fnc 
    for i in range(len(varz)): 
     res2 = res2.subs(varz[i], x0[i]) 
    fx0.append(numpy.array(res2, dtype='float')) 
+0

上に行ったように、あなたは単にfloat64ためdtype仕様にnumpy.arrayを追加することができます!どうもありがとう! –

+3

googlersのコメント - 間違ったデータ型を持つ多くのnumpy関数(これはnp.linalg.pinv(x)でしたが、xはオブジェクトdtypeが間違っています)と同じエラーです) – jeremycg