Problème de résolution de ContourPlot


11

J'ai rencontré un problème difficile avec ContourPlot, qui est quand je change la gamme de ma variable, j'obtiens un chiffre totalement nouveau. Par exemple:

ContourPlot[2.' c^4 - 1.693 c^4 x - 0.861 x^2 + 0.0417 Log[10^(-6)] x^2 + 
    0.25' x^2 Log[1/c^(2/3)] + (1.' c^4 + 0.673 x) x Log[x] - 
    0.125' x^2 Log[x]^2 == 0, {x, 3, 100}, {c, 1, 5}, PlotRange -> All] 

enter image description here

Mais si je change la gamme de c{1,5}-{1,50} la figure est différent:

enter image description here

Tout le monde sait la raison? Quel chiffre est correct?

9

Il s'agit d'un problème de résolution. Il peut être guéri en augmentant le nombre de PlotPoints utilisé:

Table[ContourPlot[ 
    2.' c^4 - 1.6931471805599454' c^4 x - 0.8611473146305157' x^2 + 
    0.041666666666666664' Log[10^(-6)] x^2 + 
    0.25' x^2 Log[ 
     1/c^(2/3)] + (1.' c^4 + 0.6732867951399863' x) x Log[x] - 
    0.125' x^2 Log[x]^2 == 0, {x, 3, 100}, {c, 1, 50}, 
    PlotRange -> All, PlotPoints -> pp, 
    PlotLabel -> "PlotPoints \[Rule] " <> ToString[pp] ], 
{pp, {Automatic, 150}} 
] 

enter image description here


12

rcollyer est juste sur la source du problème, mais il y a de meilleures façons de le manipuler que simplement tourner la manivelle (plus rapide) le PlotPoints. Avec cette option seule dont je avais besoin au sujet PlotPoints -> 300 pour obtenir une ligne lisse, qui a pris sept secondes pour rendre:

eq = 2.' c^4 - 1.6931471805599454' c^4 x - 0.8611473146305157' x^2 + 
    0.041666666666666664' Log[10^(-6)] x^2 + 
    0.25' x^2 Log[1/c^(2/3)] + (1.' c^4 + 0.6732867951399863' x) x Log[x] - 
    0.125' x^2 Log[x]^2 == 0; 

ContourPlot[Evaluate @ eq, {x, 3, 100}, {c, 1, 50}, 
    PlotRange -> All, PlotPoints -> 300] //AbsoluteTiming //Column 

enter image description here

MaxRecursion aide beaucoup dans ce cas:

ContourPlot[Evaluate @ eq, {x, 3, 100}, {c, 1, 50}, 
    PlotRange -> All, 
    PlotPoints -> 75, 
    MaxRecursion -> 6 
] // AbsoluteTiming // Column 

enter image description here

Encore mieux ici semble contrôler le niveau inférieur MaxBend paramètre:

ContourPlot[Evaluate @ eq, {x, 3, 100}, {c, 1, 50}, 
    PlotRange -> All, 
    MaxRecursion -> 3, 
    Method -> {MaxBend -> 0.5} 
] // AbsoluteTiming // Column 

enter image description here

+2

J'ai toujours fait grimper le nombre de 'PlotPoints' que même avec le ralentissement, il semble faire l'affaire. Aussi, j'ai tendance à me méfier de MaxRecursion comme je l'ai utilisé pour éteindre ma machine avant. 'MaxBend', cependant, semble prometteur. 26 août. 132013-08-26 19:29:46

+1

@rcollyer Vous avez raison, vous devez faire attention à 'MaxRecursion' car il peut s'enfuir assez facilement. 26 août. 132013-08-26 19:34:03