使用矩阵指数求解线性系统

计算科学 线性代数 矩阵 线性求解器 线性系统
2021-12-14 21:26:23

考虑线性方程组:

(1)Ax=b

在哪里

  • AFn×n,可对角化密集矩阵,在实数或复数F
  • xFn×1是一个未知向量
  • bFn×1是一个已知的右手边向量
  • n大约为 1000–10000

与通常的线性方程组不同,我无法访问本身。但是,我可以访问矩阵指数矩阵指数既可以作为显式矩阵访问,也可以作为作用在向量上的函数访问。AeA

只知道矩阵指数,我有什么选择可以找到计算矩阵对数似乎不是最好的选择,因为我怀疑能否获得任何数值稳定且相当有效的东西。(1)

我错过了一些简单的东西吗?

3个回答

您实际上是在询问如何计算,其中是给定的矩阵。有几种方法可以在不形成 ,这里对它们进行了回顾一种通用方法是使用柯西定理 的所有特征值的轮廓,因此您需要首先估计最大特征值的大小,例如,使用幂方法。然后你用梯形规则近似积分。您需要求解多个y=(logM)1bM=eAf(M)bf(M)

y=12πiΓf(z)(zIM)1bdz,
f(x)=1/log(x)ΓM(zIM)x=b, 对此,初步简化为 Hessenberg 形式是有用的。

我正在将我的评论扩展到答案。我认为该方法效率不高,但我认为它可以用于AeA

我们知道

detAdt=etAA,

所以,我们可以使用

detAdt|t=0=A,

如果我们可以近似导数

detAdtD(A).

例如,我们可以使用前向有限差​​分

detAdt|t=0ehAIh,

但问题是我们需要计算矩阵的分数幂。也许我们可以利用高阶近似并只使用矩阵的整数幂,但是我尝试过的几个不能正常工作。eA

它似乎有效,但我怀疑它是否有效。

import numpy as np
from scipy.linalg import logm, fractional_matrix_power as powm
import matplotlib.pyplot as plt

eA = np.array([
    [1, -1],
    [1, 2]])
A = logm(eA)
rel_error = []
steps = [1, 1e-1, 1e-2, 1e-3, 1e-4, 1e-5]
for h in steps:
    A1 = np.real((powm(eA, h) - np.eye(2))/h)
    rel_error.append(np.linalg.norm(A - A1)/np.linalg.norm(A))

plt.loglog(steps, rel_error)
plt.xlabel("Relative error")
plt.xlabel("$h$")
plt.savefig("matexp.png", dpi=300, bbox_inches="tight")
plt.show()

在此处输入图像描述

如果我们通过找到变换 S 对矩阵进行对角化,使得其中 D 是对角矩阵并且 D 的对角元素特征值那么相同的变换使对角,并且特征值是进行对角化并对特征值取对数,我们找到矩阵,这足以解决线性系统;并使用变换我们可以找到原始矩阵AA=SDS1DλkeAeλkeADSA.

或者,如果足够接近统一,您可以使用泰勒展开来找到B=eAAA=log(B)=(BI)+(BI)2/2(BI)3/3+...