0

n 個の任意の px 1 ベクトル x_i、pxk 行列 A_i、および npxp 正定値行列 S_i があり、*S_i* の一部 (多くの場合、ほとんど) は同じです (たとえば、2 つの異なる S 行列のみが適用され、1 つの正定行列が適用されます)。 i=1,..., n-1 および i=n の半正定 S)。すべての x_i と A_i に対して次の線形変換を行いたい:

x_i* = inv(L_i)x_i および

A_i* = inv(L_i)A_i、ここで

L_i は下三角行列であるため、L_i L'_i=S_i (または、D_i が対角行列の場合、L_i D_i L'_i=S_i よりも優れています)。

n は数個から数千個、またはそれ以上の範囲で、p は通常 10 未満、k は通常 100 未満です。Sにはゼロを含む行と列を含めることができ、元は _BB' として形成されます。ここで、B は下三重対角行列です。ただし、これらの B は使用できません。

精度を重視して、速度と精度の点でこれを達成する最適な方法は何でしょうか?

現在、私は自分で書いた LDL 分解関数をさまざまな S に使用し、L を反転して変換を計算しています。これは、少数の異なる S と大きな n のケースを扱ってきたからです。私が正しく理解していれば、精度の点で行列を明示的に反転せずに線形方程式を解く方が賢明ですが、速度のためにはより良いオプションのようです?

私は Fortran を使用しており、安定しているとは保証できない独自の LDL 分解などではなく、因数分解に LAPACK 関数を使用したいと考えていますが、どちらが良い方法かわかりません。

4

1 に答える 1

0

必要なのは、コレスキー変換と、コレスキー変換された形式を使用するソルバーだと思います。LAPACKに行くのは間違いなく良い考えです。?potrf(コレスキー分解)および?potrs (コレスキー形式の一次方程式の解法)関数を探します。LAPACKユーザーガイドの線形方程式のセクションを参照してください。

于 2012-12-13T11:02:55.830 に答える