fortran 95およびLAPACKを使用したスキューエルミート行列の行列指数


11

量子力学のシミュレーションのために、Fortran 95に没頭しています。正直なところ、私はOctaveに甘やかされてきたので、当然行列の累乗法を採用しました。(小、与えられたスキューサイズの-Hermitian行列のn × nは、この問題を解決するためにLAPACKを使用する最も効率的な方法は何ですか?LAPACK95ラッパーは使用せず、LAPACKを直接呼び出します。n36n×n


2
行列指数自体が必要ですか、それとも行列指数にベクトルを乗算する必要がありますか?
ポール

@ポール:申し訳ありませんが、これは前に見たことがありません。いいえ、マトリックス全体が必要です。
キューバイト

なぜ誰かがこの質問に反対票を投じるのでしょうか?投票する場合は、コメントに理由を残してください!おそらく、質問はこの方法で改善できます。
キューバイト

私たちはDGPADMに依存していますが、Jack Poulsonによると、もっと良い方法があるかもしれません。
マイクダンラベイ

回答:


16

歪エルミート行列の行列指数は、計算が安価です。

仮定、あなたの歪エルミート行列であるそしてAがエルミートで、経由zheevdや友人あなたが分解を得ることができますAiA

iA=UΛUH,

ここで、はユニタリ固有ベクトル行列であり、Λは実数および対角です。それから、ささいに、UΛ

A=U(iΛ)UH.

Λを取得したら、簡単に計算できますUΛ

exp(A)=exp(U(iΛ)UH)=Uexp(iΛ)UH

固有値を累乗設定最初介しzcopy、実行B = BのEXP - I Λを実行することによりzscal固有値累乗で各カラムに、そして最終的にあなたの結果を設定しますB:=UB:=Bexp(iΛ)

exp(A):=BUH

zgemm経由。


ありがとう!との明らかなトリックを見逃しました。あなたは私に必要な特定のLAPACKサブルーチンを教えてくれました。私はまだこれを正しいとマークしません(最初にテストしてみたいです)。i
キューバイト

1
急ぐ必要はありません。実際に実装したことがあるので、自信があります:
ジャックポールソン

これは、あちこちで使用している魔法のようなコードの1つになります。それが価値があることについては、おそらく他の誰も見ることのないコメント行にも感謝します。
キューバイト

2
@JackPoulson:よくやった、先生。これは、(固有値以外の)虚数を信じないメジャーを選ぶことで得られます。
ジェフオックスベリー

1
@JackPoulson:それは美しく機能します。これをありがとう。特にzscalビット。私は残りのコードの大部分を別のサブルーチンに入れましたが、これは見落としていました。
キューバイト

5

私は電話にいるので、物事を簡単にリンクすることはできず、後でリンクを追加します。「19行列の指数関数を計算する疑わしい方法」、FortranライブラリのEXPOKIT、Jitse Niesenのマトリックス指数計算のKrylovの方法に関する論文、およびNick Highamのマトリックス指数に関する最近の論文をご覧ください。行列指数のみの場合よりも行列指数とベクトルの積が必要になるのが一般的です。ここでは、クリロフ法が非常に役立ちます。説明したような小さくて密度の高い行列の場合、パデ法の方が良いかもしれませんが、ODEの数値積分のために指数法の内部で使用すると、クリロフ法で大きな成功を収めました。


ありがとう。私は19の疑わしい方法を知っていますが、エクスポイトもありますが、私が一緒に働いている人の一部は業界にいるので、著作権上の理由でそれを避けたいです。これらのライブラリに既にリンクしているので、LAPACK / BLASで実装することに熱心です。ただし、一つだけ。行列の指数関数自体が必要です。私は量子プロセストモグラフィーの変形に取り組んでおり、問題のプロセスはマトリックスによって具体化されています。後で、この行列指数関数と組み合わせて積分器を扱うことになります。
キューバイト

1

複雑な固有値解法は数学的には正しいですが、必要以上の作業を行います。残念ながら、これから説明する改善されたアプローチは、LAPACK呼び出しでは実装できません。

RC WardとLJ Gray、ACM Transを見てください。数学。柔らかい。4、278、(1978)。これは、TOMSアルゴリズム530で利用でき、netlibからダウンロードできるソフトウェアについて説明しています。これは、スキュー対称行列次のように因数分解する方法を説明しています。X

X=UDUT

UD2×21×11×1exp(0)=12×2

exp(0tt0)=(costsintsintcost)

必要な指数行列は、次のように与えられます

exp(X)=Uexp(D)UT

私は数十年にわたって量子化学コードでこのアプローチを使用してきましたが、関連するソフトウェアで問題が発生したことはありません。


@Ron Shepardこんにちは、Computational Exchange SEへようこそ。2番目と3番目の方程式を編集できますか?彼らは理解するのが少し難しいです。
ニコグアロ

0

必要なのがベクトルで乗算された行列指数だけである場合、このFortranサブルーチンあなたに役立つかもしれません。以下を計算します:

(eA)v

ここで、vはベクトル、Aは通常のエルミート行列です。EXPOKITライブラリーのサブルーチンです

そうでない場合は、このサブルーチンを検討することをお勧めします。このサブルーチンは、一般的な複雑なマトリックスAで機能します。


これは、Fortranライブラリへの参照のようには見えません。
ジェフオックスベリー

@GeoffOxberry:fortranサブルーチンを含めるように書き直した
ポール

@ポール:だめだ、怖い。私がやっていることは、プロセストモグラフィーの全マトリックスバリエーションです。さらにスキュー-エルミート!
キューバイト

回答を書き直したことを感謝しますが、編集証跡に基づいて、回答を完全に変更し、私の以前の回答の要素を取り、リンクを追加したようです。
ジェフオックスベリー

@GeoffOxberry:それどころか...私の結果はあなたのものとは独立して来ましたが、あなたが答えを書き直す機会を得る前に投稿しました:)
ポール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.