scipy.linalg.

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 例程获得。

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

示例

给定 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)