求解 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]
此方法只有在我们更改 b
和 np.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
的事实表明它确实解决了代码中的 a
和 b
。
描述等式左边的矩阵 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$.
可能这是一个非常初学者的问题。我是 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]
此方法只有在我们更改 b
和 np.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
的事实表明它确实解决了代码中的 a
和 b
。
描述等式左边的矩阵 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$.