jax.scipy.linalg.solve_sylvester#

jax.scipy.linalg.solve_sylvester(A, B, C, *, method='schur', tol=1e-08)[source]#

求解 Sylvester 方程 .. math

AX + XB = C

使用两种方法之一。

  1. Bartell-Stewart (schur) 算法(默认)[仅限 CPU]

其中 A 和 B 首先通过 Schur 分解进行分解,以构造一个交替的 Sylvester 方程:.. math

RY + YS^T = F

当 A 和 B 为实值时,R 和 S 为拟三角形式;当 A 和 B 为复值时,R 和 S 为三角形式。

  1. 特征值分解算法 [CPU 和 GPU]

参数:
  • A (ArrayLike) – 形状为 m x m 的矩阵

  • B (ArrayLike) – 形状为 n x n 的矩阵

  • C (ArrayLike) – 形状为 m x n 的矩阵

  • method (str) – “schur”是默认值,准确但速度慢;“eigen”是替代方法,速度更快但对于病态矩阵精度较低。

  • tol (float) – A 和 B 的特征值之和接近零的程度,超过该值将返回 NaN 矩阵。

返回:

形状为 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 的特征值之和接近零的程度,为病态矩阵提供良好的估计。