【问题标题】:Is there a way to force ContourPlot re-check all the points on the each stage of it's recursion algorithm?有没有办法强制 ContourPlot 重新检查其递归算法每个阶段的所有点?
【发布时间】:2011-02-05 07:09:39
【问题描述】:

感谢this Yaroslav Bulatov 对Plot 算法的出色分析,我现在明白了Plot3DContourPlot 无法平滑绘制带有中断和不连续性的函数的原因。

例如,在以下情况下,ContourPlot 根本无法绘制轮廓 x^2 + y^2 = 1:

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

这是因为该算法没有深入到 x^2 + y^2 = 1 附近的区域。它在初始阶段“丢弃”了这个区域并且没有尝试进一步研究它。增加MaxRecursion 在这个意义上没有任何作用。甚至未记录的选项 Method -> {Refinement -> {ControlValue -> .01 \[Degree]}} 也无济于事(但会使 Plot3D 更流畅一些)。

上面的函数只是一个简单的例子。在现实生活中,我正在处理无法解析解决的非常复杂的隐式函数。

有没有办法让ContourPlot 深入到靠近中断和不连续的区域?

【问题讨论】:

  • 嗯,我从 Stan Wagon 的书中得到了自适应绘图的详细信息,但它并没有过多地说明自适应 3D 绘图。您的特定示例似乎很特别,因为该函数永远不会超过 0 值,它只是“触及”它,我猜这就是 ContourPlot 找不到它的原因
  • 强相关:“Problem with ContourPlot.”

标签: wolfram-mathematica


【解决方案1】:

这些是标准绘图。

以及 10^-20 处的轮廓

它们对我来说很清楚。

您希望得到更准确的结果吗?

编辑

如果你想使用 Contours->{0} 选项,你可以使用:

【讨论】:

  • 第一个Plot3D 底部有锯齿(我的意思是飞机z=0)。这确实不顺利。感谢您指出使用Contours->{.001} 的方法。这很有用,但Mesh->All 不适合我的目的。我需要一条没有网格的平滑线。
  • 最好将您的所有建议与"ControlValue" 结合起来:ContourPlot[Abs[x^2 + y^2 - 1], {x, -1, 1}, {y, -1, 1}, MaxRecursion -> 6, PlotPoints -> 100, Method -> {"Refinement" -> {"CellDecomposition" -> "Quad", "ControlValue" -> .01}}, Contours -> {.0001}, ContourShading -> False]。唯一不好的是它需要对目标函数进行大量评估。就我而言,这非常慢......
猜你喜欢
  • 2015-06-05
  • 2021-07-02
  • 1970-01-01
  • 1970-01-01
  • 2020-11-06
  • 2019-09-01
  • 1970-01-01
  • 2016-01-11
  • 2019-12-13
相关资源
最近更新 更多