web-dev-qa-db-ja.com

numpyで行列方程式を解くエラー

Python sympynumpyを使用して独自のニュートンラプソンアルゴリズムを記述しています。

以下のコードですが、これを無視してエラーにスキップできます。

[〜#〜]コード[〜#〜]

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()

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

fncList --a python Sympy記号を使用する関数のリスト

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

x0-最初の推測

[〜#〜]エラー[〜#〜]

printjfが正常に機能し、次のように出力されるまで。

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

[-5.15598620617611, 5.13378681611922]

私が走るとき:

newtonRhapson([5*cos(a)+6*cos(a+b)-10, 5*sin(a)+6*sin(a+b)-4], [a,b], [0.7,0.7])

しかし、ラインを実行すると:

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
9
Greg Peckory

問題は2番目のforループにあります。

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

fx0に追加するときは、NumPyがLAPACKを使用してシステムの行列式を計算できるように、同じタイプ(float64)を追加していることを確認する必要があります(see- この回答 詳細)。現在、<class 'sympy.core.numbers.Float'>を追加しています-エラーメッセージは、使用するための型署名が正しくないことを示しています。

この問題を修正するにはnumpy.arrayfloat64dtype仕様を追加するだけです。上記

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'))
7
miradulo