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

Algorithm 如何找到最佳(信息量最大)绘图限制?,algorithm,plot,wolfram-mathematica,Algorithm,Plot,Wolfram Mathematica,我正在为1个变量的函数开发一个2D绘图程序。其设计非常简单,因此用户不必选择初始绘图限制(或“范围”) 是否有已知的算法可以找到最有趣的绘图限制,只知道函数f(x) 注: 这里没有很好地定义有趣的绘图限制。这是问题的一部分:情节中最有趣的部分是什么 我已经有了一个算法来确定函数f有有限值的x值的范围 我使用的是Javascript,但任何语言都可以 我不想使用现有的库 函数f仅限于用户可以使用基本数学运算符编写的表达式和函数 使用谷歌图表,你可以得到一些自动限制的例子。键入graph sin(

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

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

注:

  • 这里没有很好地定义有趣的绘图限制。这是问题的一部分:情节中最有趣的部分是什么
  • 我已经有了一个算法来确定函数f有有限值的x值的范围
  • 我使用的是Javascript,但任何语言都可以
  • 我不想使用现有的库
  • 函数f仅限于用户可以使用基本数学运算符编写的表达式和函数
  • 使用谷歌图表,你可以得到一些自动限制的例子。键入
    graph sin(x)
    效果很好,但是
    graph exp(x)
    graph log(x)
    并不能给出最佳结果。另外,
    graph sin(x*100)*exp(-x^2)
    没有选择我认为信息量最大的限制。但这对我来说已经足够好了
更新:

我发现Mathematica中的
PlotRange
自动完成的非常好(请参阅)。源代码可用吗,或者解释算法的参考资料?我到处都找不到

更新:


我开始使用一种自适应优化算法来寻找信息丰富的绘图范围,灵感来自于。它还没有很好地工作,但是目前的进度已经在我的项目中实现了。您可以尝试绘制一些函数,看看它是如何工作的。当我有一个完整的版本时,我可以发布一个答案。

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

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

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

  • 函数的一阶导数和二阶导数的所有根,除了有无穷多个根的地方

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

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

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

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

  • 找到包含函数的所有根、其一阶导数和二阶导数的范围,或者(对于具有无穷多个根的函数)距离x=0最近的8个根

  • 如果该范围尚未包含x=0,请将该范围扩展为包含x=0

  • 将x范围在每个方向上扩展10%,以确保所有“感兴趣”的点都在窗口内

  • 设置y范围,使函数绝对值的积分为(比如)图形窗口面积的30%


  • 顺便问一下,这是问这个问题的合适地方吗?还是应该在里面?或者别的什么地方?mathematica不会自动改变独立轴的范围,这显然是你问的最难的部分。@george,没错,我没有意识到这一点。我将删除问题中的评论。这个答案有很多优点,比如根的位置。然而,找到根并不是一件容易的事,尤其是当你们的根彼此非常接近,或者非常遥远的时候。那个么并没有根或导数根的函数呢,比如exp?此外,您的第2点没有意义,因为不一定包括0。你的第4点可能不适合于在很大的x范围内接近0的函数,也不适合于总是远高于0的函数。也许正是我倾向于使用的图形在x=0附近有有趣的方面。对于没有根的函数,我想知道积分启发式(即,安排图形窗口,使积分的绝对值约为图形窗口面积的30%)是否最有用。由于我们只寻找具有最高x值和最低x值的根之间的范围,因此在这种情况下,不精确的根查找(甚至缺少两个紧密间隔的根中的一个)可能不是问题。我同意您的编辑意见,Mathematica的
    PlotRange
    似乎做得很好。