Проблема разрешения ContourPlot


11

Я встретил сложную проблему с ContourPlot, то есть когда я меняю диапазон моей переменной, я получаю совершенно новую фигуру. Например:

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

Но если я изменить диапазон c от {1,5} до {1,50} фигура отличается:

enter image description here

Кто знает причину? Какая фигура верна?

9

Это проблема с разрешением. Это может быть излечена путем увеличения числа PlotPoints используется:

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 является правильным об источнике проблемы, но есть и лучше (быстрее) способов справиться с этим, чем просто сгибать вверх по PlotPoints. С одной только этот вариант мне нужно было около PlotPoints -> 300, чтобы получить плавную линию, которая заняла семь секунд, чтобы сделать:

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 помогает в этом случае:

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

enter image description here

Еще лучше, кажется, контроль нижнего уровня MaxBend параметров:

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

enter image description here

+2

Я всегда протолкнул число 'PlotPoints', так как даже с замедлением, кажется, сделать трюк. Кроме того, я, как правило, предпочитаю «MaxRecursion», поскольку я использовал его для отключения моей машины раньше. 'MaxBend', однако, выглядит многообещающим. 26 авг. 132013-08-26 19:29:46

+1

@rcollyer Вы правы, вам нужно быть осторожным с «MaxRecursion», так как он может сбежать довольно легко. 26 авг. 132013-08-26 19:34:03