2011-02-05 2 views
6

Grazie a this eccellente analisi dell'algoritmo Plot di Yaroslav Bulatov, ora capisco il motivo per cui Plot3D e ContourPlot non riescono a disegnare agevolmente funzioni con interruzioni e discontinuità.C'è un modo per forzare ContourPlot di ricontrollare tutti i punti su ogni fase del suo algoritmo di ricorsione?

Ad esempio, nel seguente caso ContourPlot non trae contorno x^2 + y^2 = 1 completo:

ContourPlot[Abs[x^2 + y^2 - 1], {x, -1, 1}, {y, -1, 1}, Contours -> {0}] 

È perché l'algoritmo non va in profondità nella regione vicino x^2 + y^2 = 1. "Cade" questa regione in una fase iniziale e non tenta di indagare ulteriormente. L'aumento di MaxRecursion non fa nulla in questo senso. E anche l'opzione non documentata Method -> {Refinement -> {ControlValue -> .01 \[Degree]}} non aiuta (ma rende Plot3D un po 'più agevole).

Questa funzione è solo un semplice esempio. Nella vita reale sto lavorando con funzioni implicite molto complicate che non possono essere risolte analiticamente.

C'è un modo per ottenere ContourPlot per andare in profondità in tali regioni vicino a interruzioni e discontinuità?

+0

Beh, ho avuto specifiche trama adattivi dal libro di Stan Wagon, ma non dice molto sul plottaggio 3D adattivo. Il tuo particolare esempio sembra speciale perché la funzione non incrocia mai il valore 0, semplicemente lo "tocca", suppongo che sia la ragione per cui ContourPlot non riesce a trovarlo. –

+0

Fortemente correlato: "[Problema con ContourPlot] (http: //mathematica.stackexchange. com/q/23363/280)." –

risposta

3

Questi sono i grafici standard.

enter image description here

enter image description here

e il contorno alla 10^-20

enter image description here

Sono abbastanza chiaro per me.

Ti aspetti qualcosa di più preciso?

Modifica

Se si desidera utilizzare i contorni -> {0} opzione, è possibile utilizzare:

enter image description here

+0

Il primo 'Plot3D' ha i bordi sul fondo (intendo il piano' z = 0'). Questo è davvero non liscio. Grazie per aver indicato un modo per usare 'Contours -> {. 001}'. È utile, ma 'Mesh-> All' non è adatto ai miei scopi. Ho bisogno di una linea liscia senza rete. –

+0

È il migliore per combinare tutti i tuoi suggerimenti con '" ControlValue "': 'ContourPlot [Abs [x^2 + y^2 - 1], {x, -1, 1}, {y, -1, 1 }, MaxRecursion -> 6, PlotPoints -> 100, Metodo -> {"Rifinitura" -> {"CellDecomposition" -> "Quad", "ControlValue" -> .01}}, Contorni -> {.0001 }, ContourShading -> False] '. L'unica cosa negativa è che richiede un numero considerevole di valutazioni della funzione obiettivo. Nel mio caso è estremamente lento ... –