如何找到最好的(信息量最大的)绘图限制?

fff*_*red 5 algorithm plot wolfram-mathematica

我正在为 1 个变量的函数开发一个 2D 绘图程序。它的设计非常简单,因此用户不必选择初始绘图限制(或“范围”)。

是否有已知的算法可以找到最有趣的绘图限制,只知道函数f(x)

笔记:

  • 的定义有趣的情节的限制是没有得到很好这里定义。这是问题的一部分:情节中最有趣的部分是什么?
  • 我已经有一个算法来确定函数f具有有限值的x值的范围。
  • 我正在使用 Javascript,但任何语言都可以。
  • 我不想使用现有的库。
  • 函数f仅限于用户可以使用基本数学运算符+ - * / ^和函数编写的表达式exp log abs sqrt sin cos tan acos asin atan ceil floor
  • 使用 Google 图表,您可以获得一些自动限制的示例。打字graph sin(x)效果很好,但graph exp(x)graph log(x)没有真正给出最好的结果。此外,graph sin(x*100)*exp(-x^2)没有选择我认为信息量最大的限制。但这对我来说已经足够了。

更新:

我发现PlotRangeMathematica中可以很好地自动执行此操作(请参阅此处)。是否有可用的源代码,或解释算法的参考资料?我在任何地方都找不到它。

更新:

我开始使用自适应优化算法来查找信息丰富的绘图范围,灵感来自这个站点。它不正常使用还,但目前的进展是在我的项目实施在这里。您可以尝试绘制一些函数,看看它是如何工作的。当我有一个完整的工作版本时,我可以发布答案。

Sim*_*mon 0

我没有完整的答案,但我可能有一些有用的想法。

对我来说,图表中有趣的部分包括:

  • 函数的所有根,除了有无限多个根的情况(我们可能对每个根不超过 8 个感兴趣)。

  • 函数的一阶导数和二阶导数的所有根,除了有无限多个根的情况。

  • 函数在 x = 0 附近的行为。

  • 渐近线的位置,尽管我不希望图表一直绘制到无穷大。

  • 为了查看图形的特征​​,我希望它占据矩形图形窗口的“合理”量。我认为这可以通过使函数在绘制范围内的绝对值积分等于绘图窗口的 20-80% 范围内来实现。

因此,设置绘图限制的启发式草图可能类似于:

  1. 求出包含函数所有根、其一阶导数和二阶导数或(对于具有无限个根的函数)最接近 x=0 的(例如)8 个根的范围。

  2. 如果范围尚未包含 x=0,请扩展范围以包含 x=0。

  3. 将 x 范围在每个方向上扩大 10%,以确保所有“有趣”的点都在窗口内。

  4. 设置 y 范围,使函数绝对值的积分为(例如)绘图窗口面积的 30%。