5

シミュレーションの問題から、MATLABで1000x1000のオーダーの複素正方行列を計算したいと思います。値はベッセル関数の値を参照しているため、行列はまったくスパースではありません。

あるパラメーター(私の場合は検索された固有関数のエネルギー)に関する行列式の変更に関心があるので、最初に調査範囲の再スケーリング係数を検索してから行列式を計算することで、現時点で問題を克服します。

result(k) = det(pre_factor*Matrix{k});

現在、これは非常に厄介な解決策であり、たとえば最大500x500の行列次元でのみ機能します。

誰かが問題の良い解決策を知っていますか?Mathematicaとのインターフェースは原理的にはうまくいくかもしれませんが、実現可能性については疑問があります。前もって感謝します

ロバート

編集:これはより高い精度に変更する必要があるため、計算の問題に対する便利な解決策は見つかりませんでした。代わりに、私はそれを使用しました

ln det M = trace ln M

つまり、kに関してそれを導出するとき

A = trace(inv(M(k))*dM/dk)

したがって、少なくともkに関する行列式の対数を変更しました。問題の物理的な背景から、Aの制約を導き出すことができ、最終的には問題に有効な回避策が得られました。残念ながら、そのような回避策を一般化できるかどうかはわかりません。

4

4 に答える 4

5

行列に定数kを掛けるときは、行列の行列式をk ^ nでスケーリングすることに注意してください。ここで、nは行列の次元です。したがって、n = 1000、k = 2の場合、行列式を次のようにスケーリングします。

>> 2^1000
ans =
     1.07150860718627e+301

もちろんこれは膨大な数であるため、失敗する可能性があります。倍精度では、MATLABはrealmaxと同じ大きさの浮動小数点数のみを表すためです。

>> realmax
ans =
     1.79769313486232e+308

その行列式を再計算するすべての作業を行う必要はありません。そのような巨大な行列の行列式を計算することは、とにかく非常に適切な問題です。

于 2010-12-03T10:44:33.387 に答える
4

速度が問題にならない場合は、行列の定数倍のスケーリングを使用det(e^A) = e^(tr A)して取得することをお勧めします(スペクトル半径が1未満になるようにします)。AA - I

編集:MatLabでは、行列の対数(logm)は三角化によって計算されます。したがって、行列の固有値を計算して乗算する(または、対数を加算する)方がよいでしょう。行列が対称であるかどうかを指定しませんでした。対称である場合、そうでない場合よりも固有値を見つけるのが簡単です。

于 2010-12-03T10:49:55.743 に答える
1

行列式の現在の値は約10^-300だとおっしゃいました。

行列式を特定の値、たとえば1で取得しようとしていますか?その場合、再スケーリングは厄介です。検討している行列は悪条件であり、マシンの精度を考慮して、出力行列式をゼロと見なす必要があります。言い換えれば、信頼できる逆関数を取得することは不可能です。

マトリックスを再スケーリングするのではなく、マトリックスの列または行を変更することをお勧めします。


Rを使用して、ランダム行列(ランダムな正規値)を使用して小さなテストを行いました。行列式は明らかにゼロ以外である必要があるようです。

> n=100
> M=matrix(rnorm(n**2),n,n)
> det(M)
[1] -1.977380e+77
> kappa(M)
[1] 2318.188
于 2010-12-03T11:28:15.763 に答える
1

これは厳密にはMATLABソリューションではありませんが、Mahoutの使用を検討することをお勧めします。これは、大規模な線形代数用に特別に設計されています。(1000x1000は、以前のスケールでは問題ありません。)

Javaを呼び出して、Mahoutとの間でデータをやり取りします。

于 2010-12-03T18:00:53.120 に答える