Error solving Matrix equation with numpy

大城市里の小女人 提交于 2019-12-04 19:36:46

问题


I'm writing my own Newton-Raphson algorithm in Python using sympy and numpy.

The code is below but you can ignore this and skip on to the error:

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

The arguments to the function are:

fncList - a python list of functions using Sympy symbols

varz - a list containing those symbols (variables)

x0 - initial guess

ERROR

Up until the point where we print j and f it works fine and prints the following:

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

[-5.15598620617611, 5.13378681611922]

when I run:

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

But on running the line:

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

I get the error:

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

回答1:


Your issue is in your second for loop.

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

When you append to fx0, you need to ensure that you are appending the same type (float64) such that NumPy can compute the determinant of your system with LAPACK (see this answer for more info). You are currently appending <class 'sympy.core.numbers.Float'> - your errror message is telling you that you have an incorrect type signature for usage.

To correct this issue, you can simply append numpy.array with a dtype specification for float64 as you did above

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


来源:https://stackoverflow.com/questions/36689080/error-solving-matrix-equation-with-numpy

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!