【问题标题】:Newton method in python for multivariables (system of equations)python中用于多变量的牛顿法(方程组)
【发布时间】:2018-05-19 11:23:56
【问题描述】:

我的代码在第一次迭代时运行良好,但之后它输出以下错误:

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

【问题讨论】:

  • x = xn_1[0]; y = xn_1[1] 获取 numpy 数组的 第一行和第二行。这意味着在您的第二次迭代中,[[(x**2)+(x*y**3)-9],[(3*y*x**2)-(y**3)-4]] 将产生一个超过 2 维的值,这可能是也可能不是您想要的,但无论如何,np.matrix 对象 必须是二维的。 xy 应该 采用什么值?另请注意,您通常应该避免使用np.matrix,无论如何它都已被弃用...但您绝对可能不应该将两者混为一谈。

标签: python numpy python-2.x


【解决方案1】:

我相信xn_1 是一个二维矩阵。尝试打印它,你会看到[[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]的方式来获取你想要的元素。

【讨论】:

    【解决方案2】:

    xn_1 是一个 numpy 矩阵,因此它的元素可以通过 item() 方法访问,而不是像数组一样。 (与[]s)

    所以改变

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

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

    【讨论】:

    • 嗯? numpy.ndarray 对象和 np.matrix 对象的元素访问方式相同。
    • xn_1[0] 返回另一个 np.matrix 对象。我不知道为什么,但似乎在矩阵对象上使用索引只会返回其他 np.matrix 对象。要获得实际数字,您必须使用item()xn_1[0][0] 返回与 xn_1[0] 相同的内容。
    • 是的,但与xn_1 具有相同形状的some_array也返回一个非缩放对象。不过,np.matrix 对象将始终被强制为二维。所以那里有差异。但从根本上说,你想要xn_1[0, 0] 而不是依赖链式索引(你也应该避免使用numpy.ndarrays,因为各种原因)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-28
    • 2018-02-26
    • 2019-10-07
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多