了解其他 CAS 如何做到这一点可能会对您有所帮助。
据我所知,Mathematica 使用以下基本算法的变体来绘制单变量函数f(x)或参数曲线(x(t),y(t))(我假设f(x)对于这个描述)。
从绘图域上规则间隔的点网格开始。(在 Mathematica 中有一个参数来控制取多少,叫做PlotPoints
。)
查看每一对连续的线段(由三个连续的点定义,(x1,f(x1)),(x2,f(x2)),(x3,f(x3))) 并在两个段的中间插入一个新的采样点 (x1+x22和x2+x32) 如果它们的角度大于阈值。
如果我们还没有达到迭代限制(MaxRecursion
在 Mathematica 中设置),从第 2 步开始重复。
其中一些在 Stan Wagon 的 Mathematica in Action 一书中进行了讨论,您可以在 Google Books 上看到。
我之前实现了这个算法,以便更好地控制我的昂贵计算函数被评估了多少次。这是第 2 步的 Mathematica 代码:
nd[{points_, values_}] :=
Transpose@{(Drop[points, 1] + Drop[points, -1])/2,
Differences[values]/Differences[points]}
subdivide1d[result_, resolution_, maxAngle_: 10] :=
Module[
{deriv, angle, dangle, pos, nf},
deriv = nd[result\[Transpose]];
angle = ArcTan[#2] & @@@ deriv;
dangle = Differences[angle];
pos = Flatten@Position[dangle, d_ /; Abs[d] > maxAngle/180 Pi];
pos = Union[pos, pos + 1];
nf = Nearest[result[[All, 1]]];
Select[deriv[[pos, 1]], Abs[# - First@nf[#]] > resolution &]
]