2013-05-31 18 views
3

我正在为1个变量的函数开发2D绘图程序。它的设计非常简单,用户不必选择初始绘图限制(或“范围”)。如何找到最好的(最丰富的)绘图极限?

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

注:

  • 有趣情节限制的定义是没有得到很好这里定义。这是问题的一部分:剧情中最有趣的部分是什么?
  • 我已经有一个算法来确定x值的范围,其中函数f具有有限值。
  • 我正在使用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)不会选择我认为最具信息性的限制。但对我来说,这足够好。

UPDATE:

我发现 PlotRange数学这是否自动非常好(见 here)。源代码是否可用或解释算法的参考?我无法在任何地方找到它。

UPDATE:

我开始使用一个适应性的改进算法来寻找信息的情节范围,从this site启发。它尚未完美运行,但目前的进展已在我的项目here中实施。你可以尝试绘制几个函数,看看它是如何工作的。当我有完整的工作版本时,我可以发布答案。

+0

顺便问一下,这个问题是否正确?或者它应该在[scicomp.SE](http://scicomp.stackexchange.com)中?或者别的地方? – fffred

+0

[相关](http://stackoverflow.com/q/6132764/2441318) – fffred

+0

mathematica不会自动调整独立轴范围,这显然是您所要求的最难的部分。 – agentp

回答

0

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

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

  • 所有功能的根源,除非有根无限多的(我们可能感兴趣的不超过8各)。

  • 该函数的一阶和二阶导数的所有根,再次除了有无限根的地方。

  • 围绕x = 0的函数的行为。

  • 渐近线的位置,虽然我不希望图形一直绘制到无穷大。

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

因此,启发式的用于设置绘图限制可能是这样的草图:

  1. 查找包括所述功能,它的第一和第二导数,或所有的根的范围内(对于具有无限根数的函数)(例如)最接近x = 0的8个根。

  2. 如果范围不包含x = 0,则扩大范围以包含x = 0。

  3. 在各个方向上扩展x范围,例如10%,以确保所有“有趣”点都在窗口内。

  4. 设置y范围,使得函数绝对值的积分是(比如说)绘图窗口区域的30%。

+0

答案中有很好的一点,比如根位置。然而,找到根并不是一件容易的事,特别是当你的根可能彼此非常接近或很远时。除了exp之类的衍生产品的根或根之外,哪些功能呢?而且,你的观点2没有意义,因为0不一定包括在内。而且你的观点4可能不足以满足函数在x范围内接近0或者函数总是远远高于0. – fffred

+0

也许这只是我倾向于使用的具有有趣方面的图接近x = 0。对于没有根的函数,我想知道积分启发式(即排列图窗口的积分绝对值大约是图窗口区域的30%)可能是最有用的。由于我们只是寻找具有最高x值和最低x值的根之间的范围,因此不准确的找到根(或者甚至缺少两个紧密间隔的根中的一个)可能不是问题。我同意你的编辑* Mathematica *的'PlotRange'似乎做得很好。 – Simon