求解包含矩阵和向量的线性方程组
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 1
:could 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])
查看 b
和 b.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
数组维数还不太了解。
不要随便将 matrix
和 vector
之类的术语导入 numpy
。 numpy
有数组,可能是1d、2d或更多(甚至0d)。它们并不完全像教科书中的线性代数对象。
我想在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 1
:could 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])
查看 b
和 b.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
数组维数还不太了解。
不要随便将 matrix
和 vector
之类的术语导入 numpy
。 numpy
有数组,可能是1d、2d或更多(甚至0d)。它们并不完全像教科书中的线性代数对象。