【问题标题】:Solving linear equations in Python (not working using linalg.solve)在 Python 中求解线性方程(不使用 linalg.solve)
【发布时间】:2018-01-20 21:25:23
【问题描述】:

这可能是一个非常初级的问题。我是 python 和此类操作的新手。但将不胜感激任何帮助。 我正在尝试使用 numpy linalg 在 Python 中求解线性方程组。

x+y+z = 2

2x-6y-z=-1

3x-2z=8

我尝试使用 linalg.solve() 函数

a = np.array([[1,2,3],[1,-6,0],[1,-1,-2]])
b = np.array([2,-1,8])
try:
    x1 = linalg.solve(a,b)
except LinAlgError:
    x1 = linalg.lstsq(a,b)[0]
print(x1)
print(np.dot(a,x1) == b)

这是输出

[ 5.38709677  1.06451613 -1.83870968]
[ True  True  True]

但是,如果我们将这些接收到的值而不是 x,y,z 放入方程式中,这将不起作用。

我尝试了另一种方法

x = np.dot(np.linalg.inv(a), b)
print(x)
print(np.dot(a,x) == b)

我收到了和以前一样的输出:

 [ 5.38709677  1.06451613 -1.83870968]

此方法仅在我们更改bnp.linalg.inv(a) 的位置时才有效。现在它给出了正确的输出。

x = np.dot(b, np.linalg.inv(a))
print(x)
print(np.dot(x,a) == b)

它适用于方程式

[ 2.  1. -1.]

那么,问题来了。 谁能解释一下为什么我不能使用linalg.solve 得到 [ 2. 1. -1.] ?

【问题讨论】:

    标签: python numpy scipy linear-algebra algebra


    【解决方案1】:

    描述等式左侧的矩阵a设置错误;

     np.linalg.solve(a.T, b)
    

    用给定的a 做你想做的事。

    您的第二种方法完成这项工作归结为这样一个事实,即对于任何二维ndarraya,以及任何形状匹配的一维ndarrayxnp.dot(a, x) 将等于np.dot(x, a.T)。之所以如此,是因为在两个操作中,被视为矩阵乘法,x 分别被视为列向量和行向量,对于任何矩阵 $A$ 和任何向量 $x$,$Ax = (x^TA^ T)^T$。

    【讨论】:

      【解决方案2】:

      看起来您的a 与您在问题开头编写的方程式不匹配。你有

      a = np.array([[1,2,3],[1,-6,0],[1,-1,-2]])
      

      对应于:

      • x + 2y + 3z
      • x - 6y
      • x - y - 2z

      这不是您在问题顶部提出的内容。

      请注意,[True, True, True] 向您展示了这一点。点积产生的值与b 匹配的事实表明它确实解决了您代码中的ab

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-27
        • 1970-01-01
        • 2023-01-15
        相关资源
        最近更新 更多