scipy.linalg.

sqrtm#

scipy.linalg.sqrtm(A, disp=<object object>, blocksize=<object object>)[源]#

计算矩阵的平方根(如果存在)。

矩阵 A 的矩阵平方根是一个矩阵 X,使得 X @ X = A。并非每个方阵都保证有矩阵平方根,例如,数组 [[0, 1], [0, 0]] 没有平方根。

此外,并非每个实矩阵都有实数平方根。因此,对于实值矩阵,如果数值上存在负实轴上的特征值,返回类型可以是复数。

参数:
Andarray

输入,最后两个维度为方阵 (..., n, n)

dispbool, 可选

如果结果中的误差估计较大,则打印警告而不是返回估计误差。(默认值:True)

自 1.16.0 版本起废弃: disp 参数已废弃,并将在 SciPy 1.18.0 中移除。之前返回的误差估计可计算为 norm(X @ X - A, 'fro')**2 / norm(A, 'fro')

blocksize整数, 可选

自 1.16.0 版本起废弃: blocksize 参数已废弃,因为它未被算法使用,并将在 SciPy 1.18.0 中移除。

返回:
sqrtmndarray

计算得到的 A 的矩阵平方根,大小相同 (..., n, n)

errestfloat

估计误差的 Frobenius 范数,||err||_F / ||A||_F。仅当 disp 设置为 False 时返回。此返回值将在 1.20.0 版本中移除,届时将只返回 sqrtm 结果。

自 1.16.0 版本起废弃。

注释

此函数使用 Schur 分解方法计算矩阵平方根,遵循 [1],对于实矩阵则遵循 [2]。此外,请注意,有些矩阵具有的平方根不是 A 的多项式。对于来自 [2] 的经典示例,矩阵满足

[ a, a**2 + 1]**2     [-1,  0]
[-1,       -a]     =  [ 0, -1]

对于任何标量 a,但它不是 -I 的多项式。因此,此函数将无法找到它们。

参考文献

[1]

Edvin Deadman, Nicholas J. Higham, Rui Ralha (2013) “Blocked Schur Algorithms for Computing the Matrix Square Root, Lecture Notes in Computer Science, 7782. pp. 171-182. DOI:10.1016/0024-3795(87)90118-2

[2] (1,2)

Nicholas J. Higham (1987) “Computing real square roots of a real matrix”, Linear Algebra and its Applications, 88/89:405-430. DOI:10.1016/0024-3795(87)90118-2

示例

>>> import numpy as np
>>> from scipy.linalg import sqrtm
>>> a = np.array([[1.0, 3.0], [1.0, 4.0]])
>>> r = sqrtm(a)
>>> r
array([[ 0.75592895,  1.13389342],
       [ 0.37796447,  1.88982237]])
>>> r.dot(r)
array([[ 1.,  3.],
       [ 1.,  4.]])