2011-06-28 32 views
5

Básicamente, estoy tratando de encontrar los valores propios para la matriz, y toma alrededor de 12 horas. Cuando termina, dice que no pudo encontrar todos los vectores propios (en realidad apenas ninguno), y soy escéptico sobre los que encontró. Todo lo que puedo hacer es publicar mi código, y espero que alguien pueda hacerme algunas sugerencias. No tengo mucha experiencia con mathematica y tal vez el tiempo de ejecución lenta y los malos resultados tienen algo que ver conmigo y no con las habilidades de mathematica. Gracias a cualquiera que responda, realmente lo aprecio.Problema con los valores propios de cálculo usando 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 *) 

Hay un poco más de mi código, pero este es el punto donde realmente se está desacelerando. Algo que definitivamente debería mencionar, es que si configuro tanto m1 como m2 para que sean cero, realmente no tengo ningún problema, pero establecer m1 en una constante hace que todo se vaya al infierno.

+2

es probablemente la pena señalar que una parte significativa del tiempo se dedica a la construcción de la matriz hacia arriba (incluso con memoization como se sugiere Timo).'RSolve' da una forma explícita para su definición recursiva de' v', aunque la fijación de la función indeterminada (a través de sus condiciones iniciales) puede complicarse por cortes de ramas, etc. En cualquier caso, si escala esto más, esto puede ser algo para mirar. – acl

Respuesta

9

Su problema es que la constante mS sigue siendo simbólica. Esto significa que Mathematica está tratando de resolver analíticamente los valores propios en lugar de numéricamente. Si su problema le permite elegir un valor numérico para mS, debe hacerlo.

El otro, sin relación, problema que tiene es que está utilizando una fórmula recursiva y que desea utilizar, por ejemplo, memoization en la siguiente línea

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

Los extras v[n, m] = almacena el valor para un determinado n y m para que no tenga que volver a recurrir hasta v[0,0] cada vez que se llame al h[n, m] en Table[].

Con esas dos cosas cuidadas, mi viejo núcleo 2 duo tarda menos de un minuto en hacer los autovalores.

+3

Lo que realmente quiero es poder mantener mS como una constante, de modo que cuando obtenga algunas soluciones pueda variar el valor de mS (es decir, me gustaría obtener la solución en términos de mS). Pero, definitivamente tiene sentido que ya no sea capaz de encontrar una solución numérica debido a eso. Creo que puedo vivir especificando un valor numérico para m1 desde el principio (podría variar eso allí en lugar de hacerlo más adelante). De todos modos, gracias por la respuesta, ¡ese truco recursivo es muy bueno! – adhanlon

+0

Si aún no lo ha hecho, eche un vistazo a lo que obtiene con cutoff = 5. El uso de números específicos para mS es probablemente el camino a seguir. –

3

Esto es una continuación de la respuesta de Timo. Me gustaría mostrar una figura así que la coloco como una respuesta en lugar de un comentario.

Dado que desea encontrar los valores propios de una matriz que tiene elementos simbólicos de 501 x 501. [Por cierto, los llamas constantes, pero ese es un nombre inapropiado. Las constantes son solo valores definidos y fijos con un nombre. Lo que describes en tu comentario en la respuesta de Timo es una variable simbólica.]

Es bueno ver qué hace una matriz totalmente simbólica para los cálculos de Eigenvalue. Esto es para una matriz de 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])} 
*) 

Se tarda hasta Array[f, {2, 2}] // Eigenvalues//ByteCount = 3384 bytes. Esto explota bastante rápido: una solución de 7x7 ya ocupa 70 MB (lleva varios minutos encontrarla). De hecho, existe una relación agradable que se encuentran entre el tamaño de la matriz y recuento de bytes:

enter image description here

La función ajustada es: recuento de bytes = E^(2,2403067075863197 + 2,2617380321848457 x tamaño de la matriz).

Como puede ver, los valores propios de una matriz simbólica de 501 x 501 no se encontrarán antes del final del universo.

[Por cierto ¿cuál es la forma posesiva de la matriz?]

+1

¡Buen gráfico! Otra forma de ver el problema es darse cuenta de que resolver los valores propios de una matriz nxn es equivalente a resolver la raíz de un polinomio de orden n. Es un hecho conocido que no hay soluciones generales para * todo * el raíces de un polinomio para n = 5 y más. Por lo tanto, MMA probablemente comience a armar una lista enorme de condiciones para los valores de la variable 'mS' bajo la cual se pueden resolver algunos de los valores propios. – Timo

+0

@Timo De hecho, MMA devuelve objetos 'Root'. Para la matriz anterior con tamaño 6 x 6, el primer miembro de esta raíz ya tiene 32,331 elementos. –

+0

Gracias por aclarar la diferencia entre una variable constante y simbólica. Lo que debería haber dicho en mi comentario es que quiero una respuesta en términos de la variable simbólica, pero como ya has demostrado que es completamente imposible, voy a tener que definirla como una constante y variar esa constante como veo ajuste. ¡Gracias! – adhanlon

Cuestiones relacionadas