用numpy求解矩阵方程的误差

2024-04-29 21:05:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Python编写自己的Newton-Raphson算法,使用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-使用Sympy符号的python函数列表

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

Tags: innumpyfor错误resprintjacobappend
1条回答
网友
1楼 · 发布于 2024-04-29 21:05:34

您的问题在第二个循环中。

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

当你附加到fx0时,你需要确保你附加了相同的类型(float64),这样NumPy就可以用LAPACK计算你的系统的行列式(参见this answer了解更多信息)。您当前正在附加<class 'sympy.core.numbers.Float'>-您的错误消息告诉您使用的类型签名不正确。

若要更正此问题,您只需附加numpy.arraydtype规范,就可以像上面那样float64

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

相关问题 更多 >