2017-12-08 3 views
1

私は疎な行列A(120,000 * 120,000)とベクトルb(120,000)を持っています。私はドキュメンテーションに従おうとしましたが、私はいつもエラーがあります。私はまた、密度を高めて行列を変更しようとしました。どのように私は線形方程式を解くことができますか?疎行列のためのAX = b

Eigen::MatrixXd H(N,N); 
    HH =Eigen:: MatrixXd(A); 
    Eigen::ColPivHouseholderQR<Eigen::MatrixXd> dec(H); 
    Eigen::VectorXd RR = dec.solve(b); 

私はメモリエラーが発生しました。 この問題を解決する方法をお探しください。

答えて

2

スパースシステムでは、一般に反復の方法を使用します。 1つの理由は、LU、QRなどの直接的なソルバ...因数分解が最初の行列を埋めることです(最初はゼロのコンポーネントがゼロ以外のものに置き換えられるという意味で記入してください)。ほとんどの場合、結果の密行列はメモリにもう収まりきらない( - >メモリエラー)。要するに、反復ソルバーは、行列ベクトル積のみを含む(塗りつぶしなし)ので、希薄性パターンを変更しません。

あなたのシステムがであるかどうかを知る必要があります。(別名SPD)の場合、conjugate gradient methodを使用できます。それ以外の場合は、BiCGSTABまたはGMRESのような非対称システムのメソッドを使用する必要があります。

ほとんどの場合、preconditionnerを使用していることを知っていなければなりません。特にシステムの状態が悪い場合は特に注意してください。

int n = 10000; 
    VectorXd x(n), b(n); 
    SparseMatrix<double> A(n,n); 
    /* ... fill A and b ... */ 
    BiCGSTAB<SparseMatrix<double> > solver; 
    solver.compute(A); 
    x = solver.solve(b); 
    std::cout << "#iterations:  " << solver.iterations() << std::endl; 
    std::cout << "estimated error: " << solver.error()  << std::endl; 

多分良いスタート(あなたの行列がSPDであれば共役勾配法を使用)です:私が見つけた固有のドキュメント(私の知る限り、前提条件なしの一例)を見てみると

。ここで、前提条件はないので、収束はむしろ遅いことに注意してください。

要約:ビッグマトリクス - >反復法+プレコンディショナー。

これは実際には最初の「基本的/素朴な」説明です。Saad's book: Iterative Methods for Sparse Linear Systemsの理論についての詳細な情報があります。繰り返しますが、このトピックは巨大で、このテーマに関する他の多くの書籍を見つけることができます。

私はEigenユーザーではありませんが、precondtioners hereがあります。 - >不完全なLU(非対称システム)または不完全なコレスキー(SPDシステム)は一般的に汎用性の高いプレコンディショナーであり、テストする最初のものがあります。

関連する問題