Python sympy
とnumpy
を使用して独自のニュートンラプソンアルゴリズムを記述しています。
以下のコードですが、これを無視してエラーにスキップできます。
[〜#〜]コード[〜#〜]
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
-最初の推測
[〜#〜]エラー[〜#〜]
print
j
とf
が正常に機能し、次のように出力されるまで。
[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
問題は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.array
にfloat64
のdtype
仕様を追加するだけです。上記
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'))