2011-06-28 14 views
5

Zasadniczo próbuję znaleźć wartości własne dla matrycy, a to zajmie około 12 godzin. Kiedy się kończy, mówi, że nie może znaleźć wszystkich wektorów własnych (właściwie prawie żadnych) i jestem sceptycznie nastawiony do tych, które znalazł. Jedyne, co naprawdę mogę zrobić, to opublikować mój kod i mam nadzieję, że ktoś może mi coś zasugerować. Nie mam zbyt dużego doświadczenia z matematyką, a być może powolny bieg i złe wyniki mają coś wspólnego ze mną, a nie z matematyką. Dziękuję każdemu, kto odpowiada, naprawdę to doceniam.Problem z obliczaniem wartości własnych za pomocą matematyki

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

Jest trochę więcej mojego kodu, ale jest to punkt, w którym to naprawdę spowalnia. Muszę zdecydowanie wspomnieć, że jeśli ustawię m1 i m2 na zero, tak naprawdę nie mam żadnych problemów, ale ustawienie m1 na stałą sprawia, że ​​wszystko idzie do piekła.

+2

to chyba warto podkreślić, że znaczny kawał czasu poświęca budowaniu up macierzy (nawet z memoization jak sugeruje Timo).'RSolve' daje jawną formę rekurencyjnej definicji' v', chociaż naprawienie nieokreślonej funkcji (poprzez twoje warunki początkowe) może być skomplikowane przez cięcia gałęzi itp. W każdym razie, jeśli skalujesz to dalej, może to być coś, patrzeć na. – acl

Odpowiedz

9

Twój problem polega na tym, że stała mS pozostaje symboliczna. Oznacza to, że Mathematica próbuje analitycznie rozwiązać dla wartości własnych zamiast liczbowo. Jeśli Twój problem pozwala wybrać wartość liczbową dla mS, powinieneś to zrobić.

Drugi, niepowiązane, problem masz jest, że używasz rekurencyjnego wzoru i chcesz używać, np memoization w poniższej linii

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

Extra v[n, m] = przechowuje wartości dla danej n i m, więc nie musisz powtarzać aż do v[0,0] za każdym razem, gdy h[n, m] jest wywoływana w Table[].

Z tymi dwoma rzeczami, którymi się opiekowałeś, mój stary core 2 duo zajmuje mniej niż minutę, aby wykonać wartości własne.

+3

To, czego naprawdę chcę, to móc utrzymać mS jako stałą, tak, że gdy otrzymam rozwiązania, osobiście mogę zmieniać wartość mS (tzn. Naprawdę chciałbym uzyskać rozwiązanie w kategoriach mS). Ale to zdecydowanie ma sens, że z tego powodu nie jest już możliwe znalezienie rozwiązania numerycznego. Myślę, że mogę żyć z określeniem wartości liczbowej dla m1 od samego początku (mógłbym tylko to zmienić zamiast później). W każdym razie, dzięki za odpowiedź, ta rekurencyjna sztuczka jest bardzo dobra! – adhanlon

+0

Jeśli jeszcze tego nie zrobiłeś, spójrz na to, co otrzymasz z wartością odcięcia = 5. Używanie określonych liczb dla MS jest prawdopodobnie drogą do zrobienia. –

3

Jest to kontynuacja odpowiedzi Timo. Chciałbym pokazać figurę, więc umieszczam ją jako odpowiedź zamiast komentarza.

Biorąc pod uwagę, że chcesz znaleźć wartości własne macierzy, która ma elementy symboliczne 501 x 501. [BTW nazywasz je stałymi, ale to jest mylące. Stałe są po prostu zdefiniowane, ustalone wartości z nazwą. To, co opisałeś w swoim komentarzu w odpowiedzi Timo, jest zmienną symboliczną.]

Dobrze jest zobaczyć, co w pełni symboliczna macierz robi dla obliczeń Wartości Własności. To jest 2 x 2 Matrix

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

Zajmuje Array[f, {2, 2}] // Eigenvalues//ByteCount = 3384 bajtów. To eksploduje dość szybko: rozwiązanie 7x7 zajmuje już 70 MB (znalezienie tej zajmuje kilka minut). W rzeczywistości nie jest miły związek można znaleźć między wielkością matrycy i liczby bajtów:

enter image description here

Zainstalowane Funkcja Ilość bajt = E^(2,2403067075863197 + 2,2617380321848457 x rozmiar matrycy).

Jak widać, wartości własne matrycy 501 x 501 nie zostaną znalezione przed końcem wszechświata.

[BTW jaki jest zaborczy forma matrycy?]

+1

Ładny wykres! Innym sposobem patrzenia na problem jest uświadomienie sobie, że rozwiązywanie wartości własnych macierzy nxn jest równoznaczne z rozwiązaniem dla pierwiastka wielomianu rzędu n-tego i wiadomo, że nie ma żadnych ogólnych rozwiązań dla * wszystkich * pierwiastki wielomianu dla n = 5 i więcej. Tak więc MMA prawdopodobnie zaczyna składać ogromną listę warunków dla wartości zmiennej "mS", pod którą można rozwiązać niektóre wartości własne. – Timo

+0

@Timo W rzeczywistości MMA zwraca obiekty 'Root'. Dla powyższej macierzy o rozmiarze 6 x 6 pierwszy element tego katalogu ma już 32331 elementów. –

+0

Dzięki za wyczyszczenie różnicy między stałą a symboliczną zmienną. To, co powinienem był powiedzieć w moim komentarzu, to to, że chcę odpowiedzi w kategoriach zmiennej symbolicznej, ale ponieważ pokazałeś, że to całkiem niemożliwe, będę musiał zdefiniować ją jako stałą i zmieniać tę stałą, jak widzę dopasowanie. Dzięki! – adhanlon

Powiązane problemy