我正在尝试使用Python来避免在我的学校的MATLAB或Maple计算机上工作。我正在尝试在Ax = b中找到x的简单任务。我有两个向量,u = [1,1,1]和v = [1,-1,2],它们组成A.对于b,我的向量是[1,5,-1]。我知道解决方案是[3,-2],这在Maple ... LinearSolve(<u|v>,<1,5,-1>)
中使用LinearSolve时得到了证实。在Numpy中,我解决此问题的代码如下......
import numpy as np
#Define vector u = (1,1,1)
u = [1,1,1]
#define vector v = (1,-1,2)
v = [1,-1,2]
x = np.array([u,v])
x = np.transpose(x)
y = np.array([1,5,-1])
try:
print(x,y)
np.linalg.solve(x,y)
except Exception as e:
print("The equation cannot be solved. "+str(e))
我已经尝试过转置矩阵A,但这并没有产生任何不同于我没有的东西。它们都产生了与错误消息完全相同的输出,如下所示。唯一的区别是当我不调用转置时矩阵x是2x3,我认为这不是我想要的。
[[ 1 1]
[ 1 -1]
[ 1 2]] [ 1 5 -1]
The equation cannot be solved. Last 2 dimensions of the array must be square
我已经阅读了文档,并且不明白为什么我不能在这里得到解决方案。根据我的理解,这应该导致以下等式... 3 [1,1,1] - 2 [1,-1,2] = [1,5,-1]。
答案 0 :(得分:1)
您的A矩阵不是正方形,因此无法使用solve。
计算良好确定的的“精确”解x,即满秩,线性矩阵方程ax = b。
...
a必须为正方形且全等级,即所有行(或等效地,列)必须是线性无关的;如果其中任何一个不成立,则使用lstsq作为系统/方程的最小二乘最佳“解”。
如上所述,您可能希望使用lstsq。
通过计算最小化欧几里德2范数的向量x来求解方程a x = b || b - a x || ^ 2。 等式可能低于,良好或过度确定(即,a的线性独立行的数量可以小于,等于或大于其线性独立列的数量) 。如果a是正方形且满秩,则x(但对于舍入误差)是等式的“精确”解。
(由我注释的大胆文字。)
使用:
np.linalg.lstsq(x,y)
代码返回[3, -2]
(作为结果的第一个元组元素),如您所料。
对于某些操作,例如解决Ax = b(将使用哪种算法),Matlab通常会有一些不透明/魔术。另一方面,Numpy更低级别,需要更多用户支持(这本身并不坏)。
摘自matlab-docs:
x = A \ B求解线性方程组A * x = B.矩阵A和B必须具有相同的行数。如果A严重缩放或几乎是单数,MATLAB®会显示警告消息,但无论如何都会执行计算。
如果A是标量,则A \ B相当于A. \ B。
如果A是一个正方形的n×n矩阵,B是一个有n行的矩阵,则x = A \ B是方程A * x = B的解,如果存在的话。
如果A是m~ = n的矩形m×n矩阵,B是m行的矩阵,则A \ B将最小二乘解返回到方程组A * x = B.