考虑线性方程组:
在哪里
- ,可对角化密集矩阵,在实数或复数
- 是一个未知向量
- 是一个已知的右手边向量
- 大约为 1000–10000
与通常的线性方程组不同,我无法访问本身。但是,我可以访问矩阵指数。矩阵指数既可以作为显式矩阵访问,也可以作为作用在向量上的函数访问。
只知道矩阵指数,我有什么选择可以找到计算矩阵对数似乎不是最好的选择,因为我怀疑能否获得任何数值稳定且相当有效的东西。
我错过了一些简单的东西吗?
考虑线性方程组:
在哪里
与通常的线性方程组不同,我无法访问本身。但是,我可以访问矩阵指数。矩阵指数既可以作为显式矩阵访问,也可以作为作用在向量上的函数访问。
只知道矩阵指数,我有什么选择可以找到计算矩阵对数似乎不是最好的选择,因为我怀疑能否获得任何数值稳定且相当有效的东西。
我错过了一些简单的东西吗?
您实际上是在询问如何计算,其中是给定的矩阵。有几种方法可以在不形成 ,这里对它们进行了回顾。一种通用方法是使用柯西定理
与。的所有特征值的轮廓,因此您需要首先估计最大特征值的大小,例如,使用幂方法。然后你用梯形规则近似积分。您需要求解多个
我正在将我的评论扩展到答案。我认为该方法效率不高,但我认为它可以用于从。
我们知道
所以,我们可以使用
如果我们可以近似导数
例如,我们可以使用前向有限差分
但问题是我们需要计算矩阵的分数幂。也许我们可以利用高阶近似并只使用矩阵的整数幂,但是我尝试过的几个不能正常工作。
它似乎有效,但我怀疑它是否有效。
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 的对角元素特征值那么相同的变换使对角,并且特征值是。进行对角化并对特征值取对数,我们找到矩阵,这足以解决线性系统;并使用变换我们可以找到原始矩阵
或者,如果足够接近统一,您可以使用泰勒展开来找到,