Mathematica分段函数不良绘图渲染

时间:2018-01-17 13:55:30

标签: plot wolfram-mathematica piecewise

我想在Mathematica 10.2中绘制用户定义的分段函数(宝塔函数)。 对我而言,这似乎很简单,简单的命令导致了糟糕的结果。

我的第一个方法是:

f[x_] := Piecewise[{{0, x <= -1}, {-Abs[x] + 1, -1 < x < 1}, {0, 
x >= 1}}]

Plot3D[ 5*f[x]*f[y], {x, -1.5, 1.5}, {y, -1.5, 1.5}]

我还尝试设置MaxRecursion,在一些情况下会导致更糟糕的结果(例如2,3)。

有人能告诉我如何以顺畅的方式绘制这个函数吗?

谢谢,

菲利克斯

Example image from Mathematica 10.2

2 个答案:

答案 0 :(得分:1)

据我所知,将可见间隙作为一项功能引入。在此之前,分段或不连续函数的绘制如下:

Plot[Piecewise[{{x, x <= 1}, {3, x > 1}}], {x, 0, 3}, Exclusions -> None]

Mathematica graphics

这种行为给人留下了错误的印象。我必须检查这是默认情况还是我完全离开这里。无论如何,正如评论中已经提到的,您可以使用Exclusions选项来获取连接图。

您不需要增加PlotPoints,因为Mathematica将(希望始终)将片段的边界识别为需要递归增加点的位置。因此,MaxRecursion选项对于给出平滑的情节更为重要。此示例仅使用10个点进行渲染,但递归值为5:

Mathematica graphics

因此,当递归足够高时,即使有10个绘图点,您的函数也会渲染得非常好。看看你在裂缝上得到了多少细分

Plot3D[5*f[x]*f[y], {x, -1.5, 1.5}, {y, -1.5, 1.5}, PlotRange -> All, 
 Exclusions -> None, PlotPoints -> 10, MaxRecursion -> 6, Mesh -> All]

Mathematica graphics Mathematica graphics

最后,请注意,差距不仅限于Piecewise函数。您可以自行验证,UnitStep也会显示差距。您可以使用未记录的函数将所有内容都转换为UnitStep

,并尝试使用您的示例
Simplify`PWToUnitStep[5*f[x]*f[y]]
(*
 5 (1 - Abs[x]) (1 - Abs[y]) (1 - UnitStep[-1 - x]) (1 - 
   UnitStep[-1 + x]) (1 - UnitStep[-1 - y]) (1 - UnitStep[-1 + y])
*)

答案 1 :(得分:0)

在所有适当考虑到@halirutan的情况下,仅将MaxRecursion设置为6在下图中不足以将分段函数的峰值调整为单调递增序列: enter image description here 另外,当我将PlotPoints设置为240时,这种情况得到了改善。 enter image description here 但是,这不能完全解决所有显示问题。例如,请注意,在上图中,尽管使用了Exclusions->None,但初始值 y = 0并未正确地绘制为蓝色垂直线。此外,Dotted的网格线不会显示为点,而会显示为在 x 轴下方延伸的虚线。通过将点或点生成为列表数据并使用ListPlot,或者在这种情况下使用ListLogPlot,并在适当时使用Joined->True,可能会更有效地解决所有这些问题。这是低级解决方案,但是在更复杂的绘图中需要用它来获得运行时间更短且对显示功能的控制更易于控制的绘图。