【问题标题】:Solve the linear equations system AX = B in Python, np.linalg.solve not working在 Python 中求解线性方程组 AX = B,np.linalg.solve 不起作用
【发布时间】:2019-10-13 11:11:55
【问题描述】:

我正在尝试求解线性方程 AX=B,其中 A、X、B 是矩阵。
我试过使用 numpynp.linalg.solve 函数,但结果似乎是错误的。
示例:

Matrix A  
[9 1 8]  
[3 2 5]  
[1 6 5]  

Matrix B  
[7 0 5]  
[7 8 4]  
[5 6 7]  

所以为了解决 X,我使用了:

X = np.linalg.solve(A,B)

结果是:

X  
[ 1.17521368 -0.17948718  0.40598291]  
[ 0.20512821 -0.30769231  0.74358974]  
[-0.56410256 -0.15384615  1.20512821]  

但如果我尝试通过将 A 乘以 X 来验证结果,则结果不是 B:

B
[ 5.40598291 -2.02564103  8.86752137]  
[ 7.61111111 -4.33333333 13.61111111]  
[ 3.15811966 -3.82051282 14.92735043]  

如果我用这个:

np.matmul(B, np.linalg.inv(A))

我得到了相同的结果,而不是求解函数。

我这里有什么遗漏吗?

编辑 1: 我已经打印了

np.allclose(np.dot(A, X), B)

并且正在返回 False

编辑 2
这是我正在使用的代码:

B = np.array([7,0,5,7,8,4,5,6,7]).reshape(3,3)
A = np.array([9,1,8,3,2,5,1,6,5]).reshape(3,3)
X = np.linalg.solve(A,B)
print(x)
#[[-1.70967742 -4.48387097  0.08064516]
# [-1.35483871 -2.74193548  0.79032258]
# [ 2.96774194  5.38709677  0.43548387]]

如果这是一个非常基本的问题,我深表歉意,我感谢任何帮助。 谢谢。

【问题讨论】:

  • 你确定你展示的AB产生了XKK1 是什么?
  • 抱歉,我现在已将其编辑为正确。

标签: python numpy linear-algebra matrix-multiplication linear-equation


【解决方案1】:

我的数组结果看起来不错:

In [582]: A=np.array([9,1,8,3,2,5,1,6,5]).reshape(3,3)                                                
In [583]: B=np.array([7,0,5,7,8,4,5,6,7]).reshape(3,3)                                                
In [584]: x=np.linalg.solve(A,B)                                                                      
In [585]: x                                                                                           
Out[585]: 
array([[-1.70967742, -4.48387097,  0.08064516],
       [-1.35483871, -2.74193548,  0.79032258],
       [ 2.96774194,  5.38709677,  0.43548387]])
In [586]: A@x                                                                                         
Out[586]: 
array([[7., 0., 5.],
       [7., 8., 4.],
       [5., 6., 7.]])

另一种方法:AX=B => X=1/A B

In [591]: np.linalg.inv(A)@B                                                                          
Out[591]: 
array([[-1.70967742, -4.48387097,  0.08064516],
       [-1.35483871, -2.74193548,  0.79032258],
       [ 2.96774194,  5.38709677,  0.43548387]])

并正式测试相等性:

In [602]: np.allclose(A@np.linalg.solve(A, B), B)                                                       
Out[602]: True

【讨论】:

    【解决方案2】:

    X 的结果是正确的。要验证您的解决方案是否正确,根据official docs,您可以使用allclose(),如果两个数组(AXB)在容差范围内按元素相等,则应返回True

    import numpy as np
    
    A = np.array([[9, 1, 8], [3, 2, 5], [1, 6, 5]])  
    B = np.array([[7, 0, 5], [7, 8, 4], [5, 6, 7]])  
    
    X = np.linalg.solve(A,B)
    
    np.allclose(np.dot(A, X), B)
    # True
    

    在您的情况下,它确实返回 True

    【讨论】:

    • np.allclose(np.dot(A,X),B) 返回 false。
    • @JoséCousiño:对我来说它返回True。 python 3.6.5 和 numpy 1.14.3
    • 我有 Python 3.7.2 和 numpy 1.16.0,它返回 false
    猜你喜欢
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    • 2013-04-15
    • 2018-08-06
    • 1970-01-01
    相关资源
    最近更新 更多