求解 Python 中的线性方程(不适用于 linalg.solve)

Solving linear equations in Python (not working using linalg.solve)

可能这是一个非常初学者的问题。我是 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.]?

看起来你的 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

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

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

用给定的 a.

做您想做的事

你的第二种方法可以归结为这样一个事实,即对于任何二维 ndarray a,以及任何一维 ndarray x形状匹配,np.dot(a, x) 将等于 np.dot(x, a.T)。之所以会出现这种情况,是因为在这两个操作中,被视为矩阵乘法,x 分别被视为列向量和行向量,并且对于任何矩阵 $A$ 和任何向量 $x$,$Ax = (x^ TA^T)^T$.