2011-08-17 8 views
6

Eseguire il codice In Mathematica:Come ottenere curve di plot accurate in 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}] 

Questo mi dà curve molto impreciso:

The curves obtained from the code above are very inaccurate

ho provato a fissare le PlotPoints e WorkingPrecision opzioni di ContourPlot-30 e 20, rispettivamente, a inutile. Noterai inoltre che l'unico parametro numerico, r, è un numero razionale esatto. Non so cos'altro da provare. Grazie.

Edit: Le curve mi aspetto di ottenere sono i tre quelli neri (contrassegnato A1, A2 e A3) sul seguente immagine

Expected curves (the black ones)

+0

Forse si può chiedere a http://math.stackexchange.com/ – plaes

+4

@plaes: Questa non è una domanda circa Matematica. È una domanda su Mathematica. – becko

+0

Puoi includere un'immagine approssimativa di ciò che ti aspetti? –

risposta

6

Sei sicuro circa l'immagine e/o la definizione per a? Dalla definizione di a segue che a[k,w]==0 su k==w ma quella curva non appare nella tua immagine.

In ogni caso, supponendo che la definizione di a è giusto, il problema con tracciando i contorni è che nel dominio w^2/r^2-k^2<0, sia p[k,w] e Sin[p[k,w]] diventano puramente immaginaria che significa che a[k,w] diventa puramente immaginaria pure. Dal ContourPlot non piacciono le funzioni con valori complessi solo le parti dei contorni nel dominio w^2/r^2>=k^2 vengono tracciate.

Non che Sin[p[k,w]]/p[k,w] sia reale per tutti i valori di k e w (ed è ben educato nel limite p[k,w]->0). Pertanto, per aggirare il problema della a diventare complesso si potrebbe tracciare i contorni a[k,w]/p[k,w]==0 invece:

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

Risultato

contour plot of a/p==0

+0

Avevi ragione. Ho avuto un errore nella definizione di 'a'. L'ho riparato. Grazie. – becko

+0

Divide per 'p' riparato. Non ho nemmeno dovuto impostare i PlotPoint o qualcosa del genere! Grazie! – becko

3

La funzione dà i numeri complessi nella regione del contorno linee che mostri. È questo che ti aspetti? Si può vedere la regione che è reale qui:

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

enter image description here

ho qualcosa in qualche modo più vicino alla vostra linee se uso:

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

enter image description here

E ' possibile c'è un errore di trascrizione?

(Le mie scuse se questo è inutile.)

+0

C'è stato un errore di trascrizione (indicato da Heike nella risposta sopra) ed è ora risolto. Tuttavia, è 'a [k, w]', non 'a [w, k]', e non ci sono errori lì. Grazie comunque. – becko

3

p ans q saranno valutati reale solo se w^2 - k^2 e w^2/r^2 - k^2 sono entrambi non negativo. w^2/r^2 - k^2 sarà solo non negativo nella seguente zona della vostra regione trama:

enter image description here

Pertanto tutto il resto sarà tagliato fuori dal ContourPlot. Forse hai bisogno di apportare alcune correzioni alle equazioni (hai solo bisogno della parte reale? Magnitudine?) Non credo che le curve che Mathematica ti dà siano molto imprecise. Altrimenti la strada da percorrere per aumentare la precisione dei contorni se aumenta PlotPoints e MaxRecursion (per esempio, per 50 e 4).

6

Ho qualcosa di molto simile a quello che ti aspetti da un tracciamento separato di parti reali e immaginarie di l.h.s. dell'equazione:

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

enter image description here

1

provare a giocare con la parametrizzazione delle vostre equazioni. Ad esempio, definire a=w^2-k^2 e b=w^2/r^2-k^2, quindi risolvere per a e b e li mappa sui k e w