求解包含矩阵和向量的线性方程组

Solving linear system of equations containing matrices and vectors

我想在Python中求解以下线性方程组:

A 是大小为 3 x 3

的矩阵

b 是长度为 3

的向量

b'代表b

的转置

c 是长度为 3

的零向量

d 是一个长度为 3

的向量

我的Python代码如下:

A = np.array(([1,2,3], [1,2,3], [1,2,3])) 
b = np.ones(3)
c = np.zeros(3)
d = np.array([4,5,6]) 

matrix1 = np.array(([A,b], [b.T, c]))
matrix2 = np.array([d, b])
        
[alpha, beta] = np.linalg.solve(matrix1, matrix2)

我收到错误 for matrix 1could not broadcast input array from shape (3,3) into shape (3)

非常感谢任何帮助!

In [2]: A = np.array(([1,2,3], [1,2,3], [1,2,3]))
   ...: b = np.ones(3)
   ...: c = np.zeros(3)
   ...: d = np.array([4,5,6])

查看 bb.T。看到什么区别了吗? A (3,) 形状已更改为 (3,) 形状。惊讶吗?那你还没有花时间阅读 np.transpose 文档。

In [3]: b
Out[3]: array([1., 1., 1.])
In [4]: b.T
Out[4]: array([1., 1., 1.])

所以让我们尝试制作你的数组:

In [5]: np.array(([A,b], [b.T, c]))
<ipython-input-5-45ec84398f1d>:1: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.
  np.array(([A,b], [b.T, c]))
Traceback (most recent call last):
  File "<ipython-input-5-45ec84398f1d>", line 1, in <module>
    np.array(([A,b], [b.T, c]))
ValueError: could not broadcast input array from shape (3,3) into shape (3,)

或者只是第一部分:

In [6]: np.array([A,b])
<ipython-input-6-dff0caaab877>:1: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.
  np.array([A,b])
Traceback (most recent call last):
  File "<ipython-input-6-dff0caaab877>", line 1, in <module>
    np.array([A,b])
ValueError: could not broadcast input array from shape (3,3) into shape (3,)

有时 np.array(...) 形状输入不一致会产生一个对象 dtype 数组;其他时候,比如这个,它会引发错误。

基本点是,我们不能通过简单地组合 (3,3) 和 (3,) 来创建一个新数组。

我们可以将 b 变成 (3,1) 形状,并将其与 A:

连接起来
In [8]: b[:,None]
Out[8]: 
array([[1.],
       [1.],
       [1.]])
In [9]: np.hstack((A,b[:,None]))
Out[9]: 
array([[1., 2., 3., 1.],
       [1., 2., 3., 1.],
       [1., 2., 3., 1.]])

我们可以对第二行进行同样的尝试

In [11]: np.hstack((b,c))
Out[11]: array([1., 1., 1., 0., 0., 0.])

但这将 (3,) 和 (3,) 连接成 (6,)(惊讶?算一下!)。但是将 (3,) 与 (1,) 连接起来会产生 (4,)

In [12]: np.hstack((b,[0]))
Out[12]: array([1., 1., 1., 0.])

这又可以加入 (3,4) 以产生 (4,4):

In [14]: np.vstack((np.hstack((A,b[:,None])), np.hstack((b,[0]))))
Out[14]: 
array([[1., 2., 3., 1.],
       [1., 2., 3., 1.],
       [1., 2., 3., 1.],
       [1., 1., 1., 0.]])

可能有更多简化的方法来构建这个数组,但我将详细介绍所有细节,因为您对 numpy 数组维数还不太了解。

不要随便将 matrixvector 之类的术语导入 numpynumpy有数组,可能是1d、2d或更多(甚至0d)。它们并不完全像教科书中的线性代数对象。