2011-06-28 16 views
5

基本的に私は行列の固有値を見つけようとしていますが、それには約12時間かかります。それが終わると、それはすべての固有ベクトル(実際にはほんの少し)を見つけることができなかったと言います、そして、私はそれが見つけたものに懐疑的です。私が本当にやることができるのは自分のコードを投稿することだけです。誰かが私にいくつかの提案をすることができたらいいと思っています。私はmathematicaにはあまり経験がなく、おそらく実行時間が遅く、悪い結果は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の両方をゼロに設定しても問題はありませんが、m1を定数に設定するとすべてが地獄になります。

+2

それはおそらく時間のかなりのチャンクが(ティモが提案されているようにもメモ化して)行列アップを構築費やされていることを指摘する価値があります。'RSolve'はあなたの再帰的な' v'の定義のための明示的な形式を与えますが、未定義の関数を(あなたの初期条件を使って)固定することは分岐の切断などによって複雑になるかもしれません。見る。 – acl

答えて

9

あなたの問題は、定数mSが記号のままであることです。これは、Mathematicaが数値ではなく固有値を解析的に解くことを試みていることを意味する。問題でmSの数値を選択できる場合は、そうする必要があります。

あなたが持っている他、関係のない、問題はn与えられたために、以下の行では、例えば、

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] =店舗値をメモ化を使用すると、再帰的な式を使用していて、使用したいということですmとなりますので、がTable[]で呼び出されるたびにv[0,0]まで再発する必要はありません。

私の古いコア2デュオの世話をする2つのものは、固有値を行うのに1分もかかりません。

+3

私が本当に欲しいのは、mSを定数として保つことです。その結果、いくつかの解が得られたら、私はmSの値を変えることができます(つまり、mSの点で解を得たいと思っています)。しかし、それは、そのために数値解をもはや見つけることができなくなったことは間違いありません。私は最初からm1の数値を指定して暮らすことができると思います。とにかく、返信のおかげで、その再帰的なトリックは非常に素晴らしいです! – adhanlon

+0

あなたがまだそれをしていないなら、あなたがcutoff = 5で得られるものを見てください。おそらく、mSに特定の番号を使用することが考えられます。 –

3

これはTimoの回答のフォローアップです。私は図を表示したいので、コメントの代わりに答えとして配置します。

501×501の記号要素を持つ行列の固有値を求めたいとします。 [あなたはそれらを定数と呼んでいますが、それは誤解です。定数はちょうど定義されていて、名前を持つ固定値です。ティモの解答であなたのコメントに記述しているのは記号変数です。]

固有値計算では完全に象徴的な行列が何をするのかよく分かります。これは、2×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を要する(これを見つけるのに数分かかる)。

enter image description here

フィット関数である:バイト数= E ^(2.2403067075863197 + 2.2617380321848457 X行列のサイズ)実際には、マトリックスのサイズとバイト数の間に見出されるべき素敵な関係があります。

ご覧のとおり、501×501の象徴行列の固有値は、宇宙の終わりまでには見つかりません。

は[BTW行列の所有格形は何ですか?]

+1

すてきなグラフ!問題を見るもう1つの方法は、nxn行列の固有値を解くことは、n次多項式の根を解くことと等価であり、* all *の一般的な解は存在しないということは分かっていますn = 5以上の多項式の根。したがって、MMAはおそらく、いくつかの固有値を解くことができる変数「mS」の値のための条件の膨大なリストを組み立て始めるでしょう。 – Timo

+0

@Timo実際、MMAは 'Root'オブジェクトを返します。上記の行列のサイズが6 x 6の場合、このRootの最初のメンバーはすでに32,331個の要素を持っています。 –

+0

定数変数とシンボリック変数の違いを解消してくれてありがとう。私のコメントで言いたいことは、象徴的な変数の観点から答えが欲しいということです。しかし、それは非常に不可能であることを示して以来、私はそれを定数として定義し、フィット。ありがとう! – adhanlon

関連する問題