我正在开发一个用于1变量函数的2D绘图程序。它的设计非常简单,因此用户不必选择初始绘图限制(或“范围”)。
是否有已知的算法可以找到最有趣的绘图限制,只知道函数 f(x)?
注意:
+ - * / ^
和函数exp log abs sqrt sin cos tan acos asin atan ceil floor
编写的表达式。graph sin(x)
效果很好,但graph exp(x)
和graph log(x)
并没有真正给出最佳效果。此外,graph sin(x*100)*exp(-x^2)
并未选择我认为最有用的限制。但这对我来说已经足够了。 更新:
我发现 Mathematica 中的 PlotRange
自动做得很好(见here)。源代码是可用的,还是解释算法的参考?我无法在任何地方找到它。
更新:
我开始使用自适应细化算法来寻找信息丰富的情节范围,灵感来自this site。它尚未完美运行,但目前的进展已在我的项目here中实施。您可以尝试绘制一些函数,看看它是如何工作的。当我有一个完整的版本时,我可以发一个答案。
答案 0 :(得分:0)
我没有完整的答案,但我可能会有一些有用的想法。
对我来说,图表中有趣的部分包括:
函数的所有根,除非有无数根(我们可能感兴趣的不超过8个)。
函数的第一个和第二个导数的所有根,再次除了有无数个根之外。
x = 0周围函数的行为。
渐近线的位置,虽然我不希望图形一直绘制到无穷大。
要查看图表的功能,我希望它能够占用“合理”数量的矩形图形窗口。我认为可以通过在绘制范围内使函数的绝对值的积分等于图形窗口的20-80%的范围来实现。
因此,用于设置绘图限制的启发式草图可能类似于:
找到包含函数的所有根,其一阶和二阶导数,或(对于具有无限根数的函数)的范围(例如)最接近x = 0的8个根。
如果范围尚未包含x = 0,请展开范围以包括x = 0。
在每个方向上扩展x范围,例如10%,以确保所有“有趣”的点都在窗口内。
设置y范围,使函数绝对值的积分(例如)为图形窗口面积的30%。