首页 文章

在Maple中完成numpy.linalg.solve中的x求解

提问于
浏览
1

我正在尝试使用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] .

1 回答

  • 1

    您的A矩阵不是正方形,因此不能使用solve .

    计算良好确定的,即满秩,线性矩阵方程ax = b的“精确”解x . ... 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.

相关问题