Проблема с вычислением собственных значений с использованием Mathematica - PullRequest
5 голосов
/ 28 июня 2011

В основном я пытаюсь найти собственные значения для матрицы, и это занимает около 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 равными нулю, у меня действительно не возникнет никаких проблем, но если установить постоянную m1, все пойдет в ад.

Ответы [ 2 ]

9 голосов
/ 28 июня 2011

Ваша проблема в том, что константа mS остается символической.Это означает, что Mathematica пытается аналитически найти собственные значения, а не численно.Если ваша проблема позволяет вам выбрать числовое значение для mS, вам следует это сделать.

Другая, не связанная с этим, проблема, с которой вы столкнулись, заключается в том, что вы используете рекурсивную формулу и хотите использовать, например, памяткув следующей строке

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[].

С этими двумя вещами, заботящимися о моем старом Core 2 Duo, уходит меньше минуты, чтобы получить собственные значения.

3 голосов
/ 29 июня 2011

Это продолжение ответа Тимо. Я хотел бы показать цифру, поэтому я размещаю ее в качестве ответа, а не комментария.

Учитывая, что вы хотите найти собственные значения матрицы, которая имеет 501 x 501 символьных элементов. [Между прочим, вы называете их константами, но это неправильно. Константы просто определены, фиксированные значения с именем. То, что вы описываете в своем комментарии к ответу Тимо, является символической переменной.]

Приятно видеть, что делает полностью символическая матрица для вычисления собственных значений. Это для матрицы 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 МБ (это займет несколько минут). На самом деле, есть хорошая связь между размером матрицы и количеством байтов:

enter image description here

Встроенная функция: число байтов = E ^ (2,2403067075863197 + 2,2617380321848457 x размер матрицы).

Как видите, собственные значения символьной матрицы 501 x 501 не будут найдены до конца вселенной.

[Кстати, что такое притяжательная форма матрицы?]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...