Algorithm 如何有效地求解线性矩阵方程:AX-XA=B?

Algorithm 如何有效地求解线性矩阵方程:AX-XA=B?,algorithm,matrix,fortran,Algorithm,Matrix,Fortran,最近我一直在用Fortran解决一些数学问题。我想到一个线性矩阵方程: AX-XA=B 其中A和B是已知的n*n矩阵,X是需要求解的矩阵。我知道这看起来像一个典型的李雅普诺夫方程。然而,为了解决该方程的空间友好性,当Kronecker乘积为: A*I-I*A(T) 是非单数的(T表示转置) 不幸的是,这不是我的情况。我问题中的Kronecker积是单数的。因此,我不能使用一种空间友好的迭代方法来解决这个问题,而是使用一种非常消耗空间的方法来显式地生成和存储Kronecker产品!!!然后我使

最近我一直在用Fortran解决一些数学问题。我想到一个线性矩阵方程:

AX-XA=B
其中A和B是已知的n*n矩阵,X是需要求解的矩阵。我知道这看起来像一个典型的李雅普诺夫方程。然而,为了解决该方程的空间友好性,当Kronecker乘积为:

A*I-I*A(T)
是非单数的(T表示转置)

不幸的是,这不是我的情况。我问题中的Kronecker积是单数的。因此,我不能使用一种空间友好的迭代方法来解决这个问题,而是使用一种非常消耗空间的方法来显式地生成和存储Kronecker产品!!!然后我使用Moore-Penrose矩阵伪逆算法生成这个巨大矩阵的伪逆,并使用库矩阵向量乘法例程来求解方程

对于小矩阵,这是正确的。但是当矩阵的大小增加时(例如,当n增加到几百个时),我的计算机的内存就完全用完了。有谁能帮上忙,这样我就可以用一个空间友好的算法来解决这个问题了?多谢各位


这不是一个严格意义上的答案,但它将帮助你取得一些进步。如果我正确理解你的问题,你想解一个sylvester方程,如这里所示

您是否尝试过LAPACK,也许:->搜索TGSY2

或者像这样:

甚至可能:


祝你好运:)

你到底为什么要使用fortran77?你应该使用带有可分配数组的现代fortran语言来解决这个问题。我不确定是否有合适的人群向你提出这个问题。我可能会试试(科学计算)。@george我完全理解你的担心。我一直在检查不同的算法(包括在帖子中提到的)在C++和MATLAB中。但是我正在处理的程序包是用FORTRAN77编写的,我没有用现代Fortran写重写整个包,虽然我计划在C++中写一些东西,不需要重写任何东西,现代Fortran完全可以用F77来压缩。我敢打赌,无论如何你都在使用现代编译器,所以请继续使用现代功能,比如allocate。(因为你没有显示代码,我只是猜测你是在尝试静态分配100100个数组)@george我已经显式地存储了反积,因为我必须多次使用它。在每次迭代中,矩阵B都会发生变化,从而得到不同的X。因此,在每次迭代中,将执行矩阵向量乘法。如果我只使用一次倒数,我肯定可以释放内存,一旦我完成使用它。顺便说一下,我确实在fortran 77代码中使用了fortran 90的东西(例如动态内存分配)。因此,我真的很想找到一种方法,可以避免大的内存需求,即使是在花费更多的时间。