solve#
- scipy.linalg.solve(a, b, lower=False, overwrite_a=False, overwrite_b=False, check_finite=True, assume_a=None, transposed=False)[源代码]#
求解未知数
x
的线性方程组a @ x == b
,其中 a 是方阵。如果已知数据矩阵是特定类型,则将相应的字符串提供给
assume_a
键会选择专用求解器。可用的选项有对角
‘diagonal’
三对角
‘tridiagonal’
带状
‘banded’
上三角
‘upper triangular’
下三角
‘lower triangular’
对称
‘symmetric’ (或 ‘sym’)
埃尔米特
‘hermitian’ (或 ‘her’)
正定
‘positive definite’ (或 ‘pos’)
一般
‘general’ (或 ‘gen’)
- 参数:
- a(N, N) array_like
方阵输入数据
- b(N, NRHS) array_like
右侧的输入数据。
- lowerbool,默认值:False
除非
assume_a
是'sym'
、'her'
或'pos'
之一,否则将被忽略。如果为 True,则计算仅使用 a 的下三角中的数据;忽略对角线上方的条目。如果为 False(默认值),则计算仅使用 a 的上三角中的数据;忽略对角线下方的条目。- overwrite_abool,默认值:False
允许覆盖 a 中的数据(可以提高性能)。
- overwrite_bbool,默认值:False
允许覆盖 b 中的数据(可以提高性能)。
- check_finitebool,默认值:True
是否检查输入矩阵是否仅包含有限数字。禁用可能会提高性能,但如果输入确实包含无穷大或 NaN,可能会导致问题(崩溃、无法终止)。
- assume_astr,可选
有效的条目在上面描述。如果省略或为
None
,则会执行检查以识别结构,以便可以调用适当的求解器。- transposedbool,默认值:False
如果为 True,则求解
a.T @ x == b
。对于复数 a,会引发 NotImplementedError。
- 返回:
- x(N, NRHS) ndarray
解数组。
- 引发:
- ValueError
如果检测到大小不匹配或输入 a 不是方阵。
- LinAlgError
如果矩阵是奇异的。
- LinAlgWarning
如果检测到病态的输入 a。
- NotImplementedError
如果 transposed 为 True 且输入 a 是复数矩阵。
备注
如果输入 b 矩阵是具有 N 个元素的一维数组,则当与 NxN 输入 a 一起提供时,即使大小明显不匹配,也会被假定为有效的列向量。这与 numpy.dot() 的行为兼容,并且返回的结果仍然是一维数组。
通用、对称、埃尔米特和正定解分别通过调用 LAPACK 的 ?GESV、?SYSV、?HESV 和 ?POSV 例程获得。
数组的数据类型定义了调用哪个求解器,而与值无关。换句话说,即使复数数组条目具有精确为零的虚部,也将根据数组的数据类型调用复数求解器。
示例
给定 a 和 b,求解 x
>>> import numpy as np >>> a = np.array([[3, 2, 0], [1, -1, 0], [0, 5, 1]]) >>> b = np.array([2, 4, -1]) >>> from scipy import linalg >>> x = linalg.solve(a, b) >>> x array([ 2., -2., 9.]) >>> np.dot(a, x) == b array([ True, True, True], dtype=bool)