scipy.linalg.
null_space#
- scipy.linalg.null_space(A, rcond=None, *, overwrite_a=False, check_finite=True, lapack_driver='gesdd')[source]#
使用 SVD 构造 A 的零空间的正交基
本文档假定数组参数具有指定的“核心”形状。但是,此函数的数组参数可能在核心形状之前附加额外的“批处理”维度。在这种情况下,数组被视为低维切片的批处理;详见 批处理线性操作。
- 参数:
- A(M, N) 类数组
输入数组
- rcond浮点数, 可选
相对条件数。小于
rcond * max(s)
的奇异值s
被视为零。默认值: 浮点数 eps * max(M,N)。- overwrite_a布尔值, 可选
是否覆盖 a;可能会提高性能。默认值为 False。
- check_finite布尔值, 可选
是否检查输入矩阵只包含有限数。禁用此功能可能会提高性能,但如果输入包含无穷大或 NaN,则可能会导致问题(崩溃、无法终止)。
- lapack_driver{‘gesdd’, ‘gesvd’}, 可选
是否使用更高效的分治法(
'gesdd'
)或通用矩形法('gesvd'
)来计算 SVD。MATLAB 和 Octave 使用'gesvd'
方法。默认值为'gesdd'
。
- 返回:
- Z(N, K) ndarray
A 的零空间的正交基。K = 有效零空间的维度,由 rcond 确定
示例
一维零空间
>>> import numpy as np >>> from scipy.linalg import null_space >>> A = np.array([[1, 1], [1, 1]]) >>> ns = null_space(A) >>> ns * np.copysign(1, ns[0,0]) # Remove the sign ambiguity of the vector array([[ 0.70710678], [-0.70710678]])
二维零空间
>>> from numpy.random import default_rng >>> rng = default_rng() >>> B = rng.random((3, 5)) >>> Z = null_space(B) >>> Z.shape (5, 2) >>> np.allclose(B.dot(Z), 0) True
基向量是正交的(存在舍入误差)
>>> Z.T.dot(Z) array([[ 1.00000000e+00, 6.92087741e-17], [ 6.92087741e-17, 1.00000000e+00]])