2011-06-28 11 views
5

Temel olarak matris için özdeğerleri bulmaya çalışıyorum ve yaklaşık 12 saat sürüyor. Tamamlandığında, tüm özvektörleri (aslında hiçbir şekilde) bulamadığını ve bulduğu şeylere kuşkuyla yaklaştığımı söylüyor. Tek yapabildiğim kodumu postalamaktır, ve birisinin bana bazı önerilerde bulunabileceğini umuyorum. Mathematica ile çok deneyimli değilim ve belki de yavaş çalışma süresi ve kötü sonuçların matematiksel yetenekleri ile değil benimle bir ilgisi var. Cevap veren herkese teşekkürler.mathematica kullanarak hesaplama özdeğerleri ile sorun

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 *) 

Kodumdan biraz daha fazlası var, ancak bu gerçekten yavaşlama noktasıdır. Kesinlikle bahsetmem gereken bir şey var ki, eğer m1 ve m2'yi sıfır olarak ayarladığımda, gerçekten herhangi bir sorunum yok, ama m1'i sabit olarak ayarlamak herşeyi cehenneme çevirir.

+2

muhtemelen zaman önemli öbek (Timo önerildiği gibi hatta memoization) matris yukarı bina harcanmaktadır belirtmekte fayda olduğunu.“RSolve”, “v” tanımlamanız için açık bir form verir, ancak belirsiz işlevi (başlangıç ​​koşullarınız aracılığıyla) düzeltmek, şube kesintileri vb. Ile karmaşık olabilir. Her halükarda, bunu daha fazla ölçeklendirirseniz, bu bir şey olabilir. bakmak. – acl

cevap

9

Sorununuz, mS sabitinin sembolik kalmasıdır. Bu, Mathematica'nın sayısal yerine özdeğerleri analitik olarak çözmeye çalıştığı anlamına gelir. Sorununuz mS için bir sayısal değer seçmenize izin veriyorsa bunu yapmalısınız.

sahip diğer ilgisiz, sorun bir n verilen için aşağıdaki satırda, örneğin

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

ekstra v[n, m] = mağaza değer Memoization bir tekrarlı formül kullanıyor ve kullanmak istediğiniz olmasıdır ve m, numaralı telefona Table[] her seferinde v[0,0] her zaman yeniden girmeniz gerekmez. Eski çekirdek 2 ikilisi halledilir bu iki şeyden ile

özdeğerleri yapmak için bir dakikadan az sürer.

+3

Gerçekten istediğim, mS'yi sabit olarak tutabilmektir, böylece bazı çözümler elde ettiğimde mS değerini kendim değiştirebilirim (yani çözümü gerçekten de mS açısından almak istiyorum). Ancak, bu kesinlikle bundan dolayı sayısal bir çözüm bulamadığı anlamına geliyor. Ben başlangıçtan m1 için sayısal bir değer belirterek yaşayabileceğimi düşünüyorum (daha sonra yerine sadece orada değişebilir). Her neyse, cevap için teşekkürler, bu yinelemeli hile çok harika! – adhanlon

+0

Şimdiye kadar yapmadıysanız, cutoff = 5 ile ne aldığınızı gözden geçirin. MS için belirli sayıların kullanılması muhtemelen gitmek için bir yoldur. –

3

Bu, Timo'nun yanıtının devamı niteliğindedir. Bir rakam göstermek istiyorum, bu yüzden bir yorum yerine bir cevap olarak yerleştirdim.

501 x 501 sembolik öğeye sahip bir matrisin Özdeğerini bulmak istediğinizi göz önünde bulundurun. [BTW onlara sabitler diyorsun, ama bu bir yanlış isim. Sabitler sadece tanımlanmış, bir isimle sabit değerler. Ne Timo cevaba yorumunuzda açıklayan sembolik değişkendir.]

Bu tamamen sembolik matris Özdeğer hesaplamalar için ne yaptığını görmek güzel. Bu 2 x 2 matris için: Bu Array[f, {2, 2}] // Eigenvalues//ByteCount = 3384 bayt alır

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])} 
*) 

. Bu oldukça hızlı bir şekilde patlıyor: 7x7'lik bir çözüm zaten 70 MB'a çıkıyor (bunu bulmak birkaç dakika sürüyor).

enter image description here

monte fonksiyonudur: bayt sayısı = e^(2,2403067075863197 + 2,2617380321848457 x matris boyutu) Aslında matris boyutu ve bayt sayısı arasında bulunabilir için iyi bir ilişki vardır. Gördüğünüz gibi

, 501 x 501 sembolik matrisin Özdeğer evrenin sonundan önce tespit edilmeyecektir.

[BTW matrisin iyelik şekli nedir?]

+1

Güzel grafik! Soruna bakmanın bir başka yolu, bir nxn matrisinin özdeğerleri için çözümlemenin, n'th dereceli bir polinomun kökü için çözülmeye eşdeğer olduğunun farkına varmaktır ve bilinen bir gerçektir. n = 5 ve üstü için bir polinomun kökleri. Bu nedenle MMA muhtemelen bazı özdeğerlerin çözülebildiği "mS" değişkeni değerleri için humojen bir koşul listesi oluşturmaya başlar. – Timo

+0

@Timo Aslında MMA 'Root' nesnelerini döndürür. 6 x 6 ebadındaki yukarıdaki matris için, bu Kökün ilk üyesi 32,331 öğeye sahiptir. –

+0

Sabit ve sembolik değişken arasındaki farkı temizlediğiniz için teşekkür ederiz. Benim yorumumda şunu söylemeliyim ki, sembolik değişken açısından bir cevap istiyorum, ama bunun çok imkansız olduğunu gösterdiğinizden beri, onu bir sabit olarak tanımlamak zorundayım ve gördüğüm kadar değişmez. fit. Teşekkürler! – adhanlon