0

ARPACK が提供する fortran 関数を使用して非対称の実数値スパース行列の固有値を計算するドライバーを C++ で作成しようとしていますが、リバース コミュニケーション アプローチに少し問題があります。

一般的に、私は通常の固有値方程式を解こうとしています:

A*v = lambda*v

行列 A とのやり取りは、関数 'av' を介して ARPACK で行われます。

av(n, workd[ipntr[0]], workd[ipntr[1]])

これは、位置「ipntr[0]」から始まる配列「workd」に保持されているベクトルを乗算し、その結果を位置「ipntr[1]」から始まる配列「workd」に挿入します。このアプローチの例は、http://www.caam.rice.edu/software/ARPACK/のマニュアルと ARPACK/EXAMPLES/SIMPLE/dnsimp.f コードにも記載されています。

私が知りたいのは、行列 A を実際にどのように使用するかということです。ルーチンに渡されない場合、提供されたベクトルでそのアクションを見つけるにはどうすればよいでしょうか?

コード例 dnsimp.f では、それらの行列 A は関数 'av' 内で計算され、'2 次元対流拡散演算子の標準中心差分離散化から導出' されます。しかし、これは問題固有のものだと思いますか? また、行列 A の導関数を関数にコード化する必要があることもあまり役に立ちません。マニュアルからもこれに関する多くの情報を見つけることができません。

これはユーザー定義関数であるため、「av」の定義を変更して行列 A をパラメーターとして含めることができるため、それほど問題ではないようです。ただし、潜在的な互換性の問題が発生した場合に備えて、それがどのように適切に行われるかを知りたい.

ありがとうございました!

4

1 に答える 1

2

マトリックスを ARPACK に提供する必要はありません。

あなたがしなければならないことは、目的の収束に達するまで、返されたベクトルで行列を乗算することです (したがって、逆通信)。

アルゴリズムの詳細については、ユーザー ガイドを参照してください。特に、基礎となるアルゴリズムに関する章を参照してください。

コメントへの対応: 基礎となるアルゴリズムは、Arnoldi Iterationの形式です。基本的なアルゴリズムはウィキペディアに示され、行列 A がアクセスされないことが示されています。直接的でも間接的でもありません。

特に、アルゴリズムは任意の正規化されたベクトル q_1 で開始します。このベクトルはユーザーに返されます。ユーザーは、お気に入りのルーチン (通常は効率的なスパース行列ベクトル乗算) を使用してこのベクトルを行列 A と乗算し、その結果をアーノルディ反復に返して、ヘッセンベルグ行列 H の一部を計算します (固有値は通常、極端な固有値に収束します)。 A の) と次のベクトル q_2。結果が収束するまで、これを繰り返す必要があります。

于 2014-09-29T18:27:32.363 に答える