2016-10-11 9 views
0

私はEigenで反復ソルバー(CGなど)にカスタムプリコンディショナーを使用しようとしています。具体的には、同様の問題を複数回解決する必要があります。行列はわずかに変化しますが、平均行列の近くにとどまります。私は平均行列のコレスキー分解を計算し、これを前提条件として使用したいと思います。私が念頭に置いていた何Eigenでカスタムプリコンディショナーを使用する方法

のようなものです:

ConjugateGradient< SparseMatrix<double>, Lower, CholmodSupernodalLLT<SparseMatrix<double>> > solver(meanMatrix); 
solver.preconditioner().compute(meanMatrix); 
// Loop on n similar matrices 
for(int i = 0; i < n; i++){ 
    // create matrix: it is similar (in structure and in values) to meanMatrix 
    SparseMatrix<double> matrix = ...; 
    // create right-hand-side 
    VectorXd rhs = ...; 
    // update matrix reference for solver 
    solver.compute(matrix); 
    // solve using the preconditioned CG 
    solver.solve(rhs); 
} 

問題がsolver.compute(マトリックス)を呼び出すと、実際に(IterativeSolverBase実際には)ConjugateGradientを引き起こすことがある(そのプレコンディショナーに計算を呼び出すために。LをIterativeSolverBase.h、固有3.2.9の111)を参照してください。

m_preconditioner.compute(*mp_matrix); 

すなわち、平均行列に基づいて、前処理は、コレスキー12月に置き換えられ新しい行列の除外、したがってCG解は1回の反復で収束する。逆に、私はと同じ前提条件(平均行列のコレスキー分解、ループの前に一度だけ計算された)を保ち、前処理済みCGを使って異なる行列を解きます。

私がやろうとしていることを達成するための簡単な方法はありますか?

ご協力いただきありがとうございます。私はこれが理にかなってほしい。そうでない場合は、私に明確にすることを躊躇しないでください。

答えて

1

CholmodSupernodalLLTの周りに必要なプレコンディショナAPIを示し、そのメソッドがノーオペレーションである小さなラッパーを書くのが1つの方法です。これは、IdentityPreconditionerからインスピレーションを得て10〜15行のコードで行うことができます。 CholmodSupernodalLLTオブジェクト(または参照)を保存し、solveを実装してm_llt.solve(b);を返すだけで、変更が唯一必要です。

関連する問題