2011-08-17 23 views
6

Ejecutar el siguiente código en Mathematica:¿Cómo obtener curvas de trazado precisas en Mathematica?

r=6197/3122; 
p[k_,w_]:=Sqrt[w^2/r^2-k^2];q[k_,w_]:=Sqrt[w^2-k^2]; 
a[k_,w_,p_,q_]:=(k^2-q^2)^2 Sin[p]Cos[q]+4k^2 p q Cos[p]Sin[q] 
a[k_,w_]:=a[k,w,p[k,w],q[k,w]]; 
ContourPlot[a[k,w]==0,{w,0,6},{k,0,14}] 

Esto me da curvas muy imprecisos:

The curves obtained from the code above are very inaccurate

He intentado fijar los PlotPoints y WorkingPrecision opciones de ContourPlot a 30 y 20, respectivamente, a Sin resultado. También notará que el único parámetro numérico, r, es un número racional exacto. No sé qué más probar. Gracias.

Editar: Las curvas que esperan obtener son los tres negros (marcada A1, A2 y A3) en la siguiente imagen

Expected curves (the black ones)

+0

Tal vez se le puede pedir al http://math.stackexchange.com/ – plaes

+4

@plaes: Esta no es una pregunta acerca Matemáticas. Es una pregunta sobre Mathematica. – becko

+0

¿Puede incluir una imagen de aproximadamente lo que espera? –

Respuesta

6

¿Estás seguro de la imagen y/o la definición de a? De la definición de a se deduce que a[k,w]==0 en k==w pero esa curva no aparece en su imagen.

De todos modos, suponiendo que la definición de a es correcto, el problema con el trazado de los contornos es que en el dominio w^2/r^2-k^2<0, tanto p[k,w] y Sin[p[k,w]] convierten puramente imaginario que significa que a[k,w] convierte puramente imaginario también. Como ContourPlot no le gustan las funciones con valores complejos, solo se trazan las partes de los contornos en el dominio w^2/r^2>=k^2.

No es que Sin[p[k,w]]/p[k,w] es real para todos los valores de k y w (y se comporta muy bien en el límite p[k,w]->0). Por lo tanto, para evitar el problema de a convertirse complejo se podría trazar los contornos a[k,w]/p[k,w]==0 lugar:

ContourPlot[a[k, w]/p[k, w] == 0, {w, 0, 6}, {k, 0, 14}] 

Resultado

contour plot of a/p==0

+0

Tenías razón. Tuve un error en la definición de 'a'. Lo arreglé. Gracias. – becko

+0

Dividir por 'p' solucionado. ¡Ni siquiera tuve que configurar PlotPoints, ni nada! ¡Gracias! – becko

3

Su función proporciona los números complejos en la región del contorno líneas que muestra. ¿Es eso lo que esperas? Se puede ver la región que es real aquí:

ContourPlot[a[k, w], {w, 0, 6}, {k, 0, 14}] 

enter image description here

me cae algo de alguna manera más cerca de sus líneas si uso:

ContourPlot[a[w, k] == 0, {w, 0, 6}, {k, 0, 14}] 

enter image description here

¿Es posible hay un error de transcripcion?

(Mis disculpas si esto no es útil.)

+0

Hubo un error de transcripción (señalado por Heike en la respuesta anterior) y está corregido ahora. Sin embargo, es 'a [k, w]', no 'a [w, k]', y no hay ningún error allí. Gracias de cualquier manera. – becko

3

p ans q serán de valor real sólo si w^2 - k^2 y w^2/r^2 - k^2 son tanto no negativo. w^2/r^2 - k^2 sólo será no negativo en la siguiente área de la región de terreno:

enter image description here

Por lo tanto todo lo demás serán cortados por ContourPlot. Quizás necesites hacer algunas correcciones a las ecuaciones (¿solo necesitas la parte real? ¿Magnitud?) No creo que las curvas que te da Mathematica sean muy inexactas. De lo contrario, el camino a seguir para aumentar la precisión de los contornos si aumenta PlotPoints y MaxRecursion (por ejemplo, a 50 y 4).

6

Tengo algo muy similar a lo que esperas al trazar por separado partes reales e imaginarias de l.h.s. de la ecuación:

ContourPlot[{[email protected][k, w] == 0, [email protected][k, w] == 0}, {w, 0, 6}, {k, 0, 14}, 
    MaxRecursion -> 7] 

enter image description here

1

tratar de jugar con la parametrización de sus ecuaciones. Por ejemplo, defina a=w^2-k^2 y b=w^2/r^2-k^2, luego resuelva para a y b y asignarlos a k y w

Cuestiones relacionadas