6

基本的に、行列の固有値を見つけようとしていますが、約 12 時間かかります。完了すると、すべての固有ベクトルを見つけることができなかったと表示されます (実際にはほとんど見つかりませんでした)。私が実際にできることは、自分のコードを投稿することだけです。誰かが私にいくつかの提案をしてくれることを願っています. 私は mathematica の経験があまりないので、実行時間が遅く、結果が悪いのは、mathematica の能力ではなく、私に関係があるのか​​もしれません。返信してくれた人に感謝します。本当に感謝しています。

cutoff = 500; (* set a cutoff for the infinite series *)
numStates = cutoff + 1; (* set the number of excited states to be printed *)
If[numStates > 10, numStates = 10];

    $RecursionLimit = cutoff + 256; (* Increase the recursion limit to allow for the specified cutoff *)
(* set the mass of the constituent quarks *)
m1 := mS; (* just supposed to be a constant *)
m2 := 0;

(* construct the hamiltonian *)
h0[n_,m_] := 4 Min[n,m] * ((-1)^(n+m) * m1^2 + m2^2);

v[0,m_] := 0;
v[n_,0] := 0;
v[n_,1] := (8/n) * ((1 + (-1)^(n + 1)) / 2);
v[n_,m_] := v[n - 1, m - 1] * (m/(m - 1)) + (8 m/(n + m - 1))*((1 + (-1)^(n + m))/2);

h[n_,m_] := h0[n,m] + v[n,m];

(* construct the matrix from the hamiltonian *)
mat = Table[h[n,m], {n, 0, cutoff}, {m, 0, cutoff}] // FullSimplify;

(* find the eigenvalues and eigenvectors, then reverse the order *)
PrintTemporary["Finding the eigenvalues"];
{vals, vecs} = Eigensystem[N[mat]] // FullSimplify;

$RecursionLimit = 256; (* Put the recursion limit back to the default *)

私のコードはもう少しありますが、これは実際に速度が低下しているポイントです。m1 と m2 の両方を 0 に設定しても特に問題はありませんが、m1 を定数に設定するとすべてがうまくいきません。

4

2 に答える 2

10

あなたの問題は、定数mSがシンボリックのままであるということです。これは、Mathematicaが数値ではなく固有値を解析的に解こうとしていることを意味します。問題によって数値を選択できる場合は、mSそうする必要があります。

もう1つの無関係な問題は、再帰式を使用していて、たとえば次の行のメモ化を使用したいということです。

v[n_, m_] := v[n, m] = v[n - 1, m - 1]*(m/(m - 1)) 
                     + (8 m/(n + m - 1))*((1 + (-1)^(n + m))/2);

エクストラv[n, m] =は指定された値を格納するため、nで呼び出されるたびmにずっと繰り返す必要はありません。v[0,0]h[n, m]Table[]

これらの2つのことで、私の古いコア2デュオは、固有値を実行するのに1分もかかりません。

于 2011-06-28T18:17:53.687 に答える
4

これはティモの答えのフォローアップです。図を表示したいので、コメントではなく回答として配置します。

501 x 501 の記号要素を持つ行列の固有値を見つけたいとします。[ところで、あなたはそれらを定数と呼んでいますが、それは誤称です。定数は、定義された名前付きの固定値です。Timo's answer のコメントで説明しているのは、シンボリック変数です。]

固有値の計算で完全なシンボリック行列が何をするかを見るのは良いことです。これは 2 x 2 行列の場合です。

Array[f, {2, 2}] // Eigenvalues

(* ==> 
 {1/2 (f[1, 1]+f[2, 2]-Sqrt[f[1, 1]^2+4f[1, 2] f[2, 1]-2 f[1, 1] f[2, 2]+f[2, 2]^2]), 
 1/2(f[1, 1]+f[2, 2]+Sqrt[f[1, 1]^2+4 f[1, 2] f[2, 1]-2 f[1, 1] f[2, 2]+f[2, 2]^2])}   
*)

Array[f, {2, 2}] // Eigenvalues//ByteCount= 3384バイトかかります。これはかなり急速に爆発します。7x7 ソリューションはすでに 70 MB を占めています (これを見つけるのに数分かかります)。実際、行列のサイズとバイト数の間には良い関係があります。

ここに画像の説明を入力

適合関数は次のとおりです。バイト数 =E^(2.2403067075863197 + 2.2617380321848457 x 行列サイズ)。

ご覧のとおり、501 x 501 の記号行列の固有値は、宇宙の終わりまでは見つかりません。

[ところで、matrix の所有格は何ですか?]

于 2011-06-29T07:47:35.080 に答える