jax.scipy.linalg.solve_sylvester#
- jax.scipy.linalg.solve_sylvester(A, B, C, *, method='schur', tol=1e-08)[source]#
求解 Sylvester 方程 .. math
AX + XB = C
使用两种方法之一。
Bartell-Stewart (schur) 算法(默认)[仅限 CPU]
其中 A 和 B 首先通过 Schur 分解进行分解,以构造一个交替的 Sylvester 方程:.. math
RY + YS^T = F
当 A 和 B 为实值时,R 和 S 为拟三角形式;当 A 和 B 为复值时,R 和 S 为三角形式。
特征值分解算法 [CPU 和 GPU]
- 参数:
- 返回:
形状为 m x n 的矩阵
- 返回类型:
X
示例
>>> A = jax.numpy.array([[1, 2], [3, 4]]) >>> B = jax.numpy.array([[5, 6], [7, 8]]) >>> C = jax.numpy.array([[6, 8], [10, 12]]) >>> X = jax.scipy.linalg.solve_sylvester(A, B, C) >>> print(X) [[1. 0.] [0. 1.]]
注意事项
Bartel-Stewart 算法之所以健壮,是因为 Schur 分解始终存在,即使对于缺陷矩阵也是如此,并且它比特征值分解方法能更好地处理复数和病态问题。然而,也有一些缺点。首先,它比特征值分解方法计算成本更高,因为你需要执行 Schur 分解,然后扫描整个解矩阵。其次,与特征值分解方法相比,它需要更多的系统内存。
特征值分解方法是求解 Sylvester 方程的最快方法。然而,这种速度也带来了一些缺点。首先,A 和 B 必须是可对角化的,否则特征向量将是线性相关的且病态,导致精度问题。其次,当特征向量不正交时,舍入误差会被放大。
此外,对于复数类型,随着矩阵尺寸的增加,结果的精度会下降。Float64 类型对这种退化最稳健。
tol 参数允许你指定矩阵可以病态到何种程度仍然可以估计一个解。对于病态矩阵,我们建议使用 float64 而不是默认的 float32 数据类型。求解器仍然可以根据 A 和 B 的特征值之和接近零的程度,为病态矩阵提供良好的估计。