使用Fortran 95和LAPACK的实数不对称矩阵的矩阵指数


10

最近,我对倾斜的Hermitian矩阵提出了同样的问题。受此问题的成功启发,在将我的头撞在墙上几个小时之后,我正在研究真实的非对称矩阵的矩阵指数。寻找特征值和特征向量的方法似乎有些复杂,我怕迷路了。

背景:前段时间,我在理论物理学SE上问了这个问题。结果使我可以将主方程式表达为真实的非对称矩阵。在与时间无关的情况下,通过对该矩阵求幂来求解主方程。在与时间有关的情况下,将需要集成。我现在只关心时间独立性。

看完我认为应该调用的各种子例程(?gehrd?orghr?hseqr ...),尚不清楚将矩阵从转换real*8complex*16并进行这些例程的复杂双精度版本是否更简单,或坚持使用real*8,将数组的数量加倍,然后再制成一个复杂的矩阵。

那么,我应该调用哪些例程(以什么顺序),并且应该使用实数双精度版本还是复数双精度版本?下面是使用真正的双重版本进行此操作的尝试。我陷入了寻找的特征值和特征向量的困境L*t

function time_indep_master(s,L,t)
  ! s is the length of a side of L, which is square.
  ! L is a real*8, asymmetric square matrix.
  ! t is a real*8 value corresponding to time.
  ! This function (will) compute expm(L*t).

  integer, intent(in)    :: s
  real*8,  intent(in)    :: L(s,s), t
  real*8                 :: tau(s-1), work(s), wr(s), wi(s), vl
  real*8, dimension(s,s) :: time_indep_master, A, H, vr
  integer                :: info, m, ifaill(2*s), ifailr(2*s)
  logical                :: sel(s)

  A = L*t
  sel = .true.

  call dgehrd(s,1,s,A,s,tau,work,s,info)
  H = A
  call dorghr(s,1,s,A,s,tau,work,s,info)
  call dhseqr('e','v',s,1,s,H,s,wr,wi,A,s,work,s,info)
  call dhsein('r','q','n',sel,H,s,wr,wi,vl,1,vr,s,2*s,m,work,ifaill,ifailr,info)

  ! Confused now...

end function

Answers:


8

首先,我将非常认真地考虑矩阵是否真的完全是任意的:是否有任何变换可以使它成为Hermitian?物理学是否保证矩阵应该是对角线化的(具有适当条件的特征向量矩阵)?

如果事实证明确实没有要利用的对称性,那么您应该先阅读19种计算矩阵指数的可疑方法,这是标准参考书(由MATLAB的作者和G&vL的合著者编写) 。


1
我能做的最好的事情就是将其变成具有不对称块的块对角矩阵。但这本身很有趣。这些块大多数是,我可以通过解析来解决。剩下的块没有对称性可利用。4 × 42×24×4
qubyte

1
我喜欢这个答案;非对称案例具有足够的陷阱,如果您的问题的表述导致对称矩阵而不是非对称矩阵,则值得考虑。
JM

@ MarkS.Everitt:您似乎快到了……矩阵有多大?还是〜36 x 36?
Jack Poulson '02

在这种情况下,但是它有可能达到。36 × 3616×1636×36
qubyte

2
@ MarkS.Everitt:所以您的问题实际上就是如何对4x4矩阵求幂。对于渐进分析而言,这个值足够小,因此无关紧要,因此答案将完全取决于值。除非您将链接的物理学职位翻译成线性代数(什么是超级运算符?!?),否则我真的不能再说了。
Jack Poulson '02

7

根据杰克所说的话,似乎在软件中使用的标准方法(如您先前问题中提到的EXPOKIT)是缩放和平方,然后是Padé逼近(方法2和3)或Krylov子空间方法(方法)。 20)。特别是,如果您正在查看指数积分器,则需要考虑Krylov子空间方法,并查看有关指数积分器的论文(Moler&van Loan论文中的方法20中提到了一些参考)。

如果您不愿意使用特征向量,请考虑使用特征向量的三角系统(方法15);由于矩阵可能是不可对角的,因此此方法可能不是最佳方法,但比尝试直接计算特征向量和特征值更好(即方法14)。

简化为Hessenberg形式不是一个好主意(方法13)。

对于我来说,究竟是使用实数运算还是使用复数运算会更好,因为Fortran复数运算速度很快,但可能会出现上溢/下溢现象(请参阅“ Fortran编译器的真正优势有多大?”),这对我来说并不明显。

您可以放心地忽略方法5-7(基于ODE求解器的方法效率低下),方法8-13(昂贵),方法14(很难计算没有特殊结构的大矩阵特征向量,并且在病态情况下容易出现数值误差) ,以及方法16(计算矩阵的Jordan分解在数值上不稳定)。方法17-19实施起来比较棘手;特别是方法17和18需要更多阅读。如果Padé逼近效果不佳,则方法1是用于缩放和平方的后备选项。

编辑#1:根据对杰克回答的评论,块对角线化似乎是一个选择,在这种情况下,方法18(块-三角形对角线化)之类的方法非常有用。我一开始就犹豫不决地推荐它,因为您的问题没有指定这种结构,但是如果您有一个变换使矩阵对角线化,那么它将消除大部分方法的复杂性。您只需要确保使用GW Stewart的技巧即可将每个块对角矩阵分解为Bj

Bj=γjI+Ej,

其中是第个块对角矩阵的特征值的平均值。这种分解将使几乎为零,这将提高矩阵指数计算的准确性。杰克链接到的Moler&van Loan论文版本的第26页上讨论了这个技巧。 Ĵ é ĴγjjEj


1
人们对此表示反对,但是实施LAPACK的人并不擅长于复杂的算术,尤其是考虑到Kahan一直在分析它。但是,如果他保存翻牌圈,他仍然应该以实数计算。相对于所有的稠密线性代数,转换成本仅为。O n 3O(n2)O(n3)
Jack Poulson '02

毫无疑问,他们知道自己在做什么。我不担心LAPACK的实现。我对Fortran编译器的行为感到惊讶。
Geoff Oxberry'2

2
是的,编译器可能比编写良好的LAPACK更大。令人不安的是,发现您的程序失败仅是因为编译器使用的绝对值和除法的实现被破坏了……
JM

-1

我有一个简单的Fortran子例程,该子例程可计算任意矩阵的指数。我对照Matlab命令检查了它,很好。它基于缩放和平方。我几年前写的。

我想查找另一个子程序,例如从gams.nist.gov下载的子程序。但是还没有运气。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.