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.]])