scipy.linalg.

solve#

scipy.linalg.solve(a, b, lower=False, overwrite_a=False, overwrite_b=False, check_finite=True, assume_a='gen', transposed=False)[source]#

求解线性方程组 a @ x == b,其中 x 是未知数,a 是方阵。

如果数据矩阵已知为特定类型,则将相应的字符串提供给 assume_a 键将选择专用求解器。可用的选项有:

通用矩阵

‘gen’

对称

‘sym’

厄米特

‘her’

正定

‘pos’

如果省略,则默认结构为 'gen'

数组的数据类型定义了调用哪个求解器,而与值无关。换句话说,即使复数数组的条目具有精确为零的虚部,也会根据数组的数据类型调用复数求解器。

参数:
a(N, N) array_like

方形输入数据

b(N, NRHS) array_like

右侧输入数据。

lowerbool, default: False

如果 assume_a == 'gen'(默认值)则忽略。如果为 True,则计算仅使用 a 下三角中的数据;对角线上方的条目将被忽略。如果为 False(默认值),则计算仅使用 a 上三角中的数据;对角线下方条目将被忽略。

overwrite_abool, default: False

允许覆盖 a 中的数据(可能提高性能)。

overwrite_bbool, default: False

允许覆盖 b 中的数据(可能提高性能)。

check_finitebool, default: True

是否检查输入矩阵是否仅包含有限数值。禁用可能会带来性能提升,但如果输入包含无穷大或 NaN 可能会导致问题(崩溃、非终止)。

assume_astr, {‘gen’, ‘sym’, ‘her’, ‘pos’}

上面解释了有效条目。

transposedbool, default: 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 例程获得的。

示例

给定 ab,求解 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)