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 をパラメーターとして含めることができるため、それほど問題ではないようです。ただし、潜在的な互換性の問題が発生した場合に備えて、それがどのように適切に行われるかを知りたい.
ありがとうございました!