scipy.linalg.

求解#

scipy.linalg.solve(a, b, lower=False, overwrite_a=False, overwrite_b=False, check_finite=True, assume_a=None, transposed=False)[源代码]#

求解方程 a @ x = b 中的 x,其中 a 是方阵。

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

对角

‘diagonal’

三对角

‘tridiagonal’

带状

‘banded’

上三角

‘upper triangular’

下三角

‘lower triangular’

对称

‘symmetric’ (或 ‘sym’)

厄米

‘hermitian’ (或 ‘her’)

对称正定

‘positive definite’ (或 ‘pos’)

一般

‘general’ (或 ‘gen’)

本文档假定数组参数具有指定的“核心”形状。然而,此函数的数组参数可能在核心形状前附加额外的“批处理”维度。在这种情况下,数组被视为较低维度切片的批处理;详见 批处理线性操作

参数:
a(N, N) 类数组

方形输入数据

b(N, NRHS) 类数组

右侧的输入数据。

lower布尔型,默认值:False

除非 assume_a'sym''her''pos' 之一,否则此参数将被忽略。如果为 True,计算将仅使用 a 的下三角数据;对角线上方的值将被忽略。如果为 False(默认值),计算将仅使用 a 的上三角数据;对角线下方的值将被忽略。

overwrite_a布尔型,默认值:False

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

overwrite_b布尔型,默认值:False

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

check_finite布尔型,默认值:True

是否检查输入矩阵仅包含有限数。禁用此选项可能会提高性能,但如果输入包含无穷大或 NaNs,则可能导致问题(崩溃、无法终止)。

assume_a字符串,可选

有效条目如上所述。如果省略或为 None,则会执行检查以识别结构,以便调用适当的求解器。

transposed布尔型,默认值:False

如果为 True,求解 a.T @ x == b。对于复数 a,会引发 NotImplementedError

返回:
x(N, NRHS) ndarray

解数组。

引发:
ValueError

如果检测到大小不匹配或输入 a 不是方阵。

LinAlgError

如果计算因矩阵奇异性而失败。

LinAlgWarning

如果检测到病态输入 a。

NotImplementedError

如果 transposed 为 True 且输入 a 是复数矩阵。

备注

如果输入 b 矩阵是具有 N 个元素的 1-D 数组,当与 NxN 输入 a 一起提供时,尽管存在明显的大小不匹配,它仍被假定为有效的列向量。这与 numpy.dot() 行为兼容,并且返回的结果仍然是 1-D 数组。

一般、对称、厄米和正定解分别通过调用 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)