用于多变量的python中的牛顿方法(方程组)

时间:2017-12-05 17:51:53

标签: python numpy python-2.x

我的代码在第一次迭代时运行正常但在此之后它会输出以下错误:

ValueError: matrix must be 2-dimensional

据我所知(在python中并不多),我的代码是正确的。但我不知道,为什么它没有正确运行所有给定的迭代。任何人都可以帮我解决这个问题。

from __future__ import division
import numpy as np
import math
import matplotlib.pylab as plt
import sympy as sp
from numpy.linalg import inv

#initial guesses
x = -2
y = -2.5
i1 = 0

while i1<5:
    F= np.matrix([[(x**2)+(x*y**3)-9],[(3*y*x**2)-(y**3)-4]])
    theta = np.sum(F)
    J = np.matrix([[(2*x)+y**3, 3*x*y**2],[6*x*y, (3*x**2)-(3*y**2)]])
    Jinv = inv(J) 
    xn = np.array([[x],[y]])    
    xn_1 = xn - (Jinv*F)
    x = xn_1[0]
    y = xn_1[1]
    #~ print theta
    print xn
    i1 = i1+1

2 个答案:

答案 0 :(得分:1)

xn_1是一个numpy矩阵,因此使用item()方法访问它的元素,而不是数组。 ([] s)

所以只需改变

x = xn_1[0]
y = xn_1[1]

x = xn_1.item(0)
y = xn_1.item(1)

答案 1 :(得分:1)

我相信xn_1是一个2D矩阵。尝试将其打印出来,您会看到[[something], [something]]

因此,要获得x和y,您需要使用多维索引。这就是我做的事情

x = xn_1[0,0]
y = xn_1[1,0]

这是有效的,因为在2D矩阵xn_1内是两个单元素数组。因此,我们需要进一步索引0以获得该单个元素。

编辑:为了澄清,xn_1[1,0]表示索引1,然后将该子阵列和索引0加在其上。 And although according to Scipy它似乎应该在功能上等同于xn_1[1][0]仅适用于一般np.array类型,而不适用于np.matrix类型Here is an excellent thread on SO that explains this

因此,您应该使用xn_1[1,0]方式获取所需的元素。