【问题标题】:Find the first root and local maximum/minimum of a function查找函数的第一个根和局部最大值/最小值
【发布时间】:2018-01-25 18:55:52
【问题描述】:

问题

我要找

  • 第一个词根
  • 第一个局部最小值/最大值

给定范围内的黑盒函数。

该函数具有以下属性:

  • 它是连续且可微的。
  • 它是常数和周期函数的组合。所有时期都是已知的。

(如果可以用较弱的假设来做就更好了)

求根和极值的最快方法是什么?

我需要更多的假设或函数界限吗?

我尝试过的

我知道我可以使用root-finding algorithm。我不知道的是如何有效地找到第一个根。

它需要足够快,以便它可以在几毫秒内以 1.0 的精度和 1.0e+8 的范围运行,这就是问题所在。

由于范围可能非常大并且应该足够精确,因此我无法通过检查所有可能的子范围来强制它。

我考虑过bisection method,但如果函数在该范围内只有一个大根,则查找第一个根太慢,因为应检查每个子范围。


如果解决方案是在 java 中是可取的,但任何类似的语言都可以。


背景

我想计算任意天体何时达到一定高度。

这是一个配置定义的虚拟对象,所以我不能假设任何关于该对象的内容。

由于涉及到各种坐标,因此无论是解析解还是简单近似都不容易。

我决定为此找到一个数值解。

【问题讨论】:

  • 所以,对于第一个根,请阅读这篇文章:stackoverflow.com/questions/16501182/…
  • 我投票结束这个问题,因为它看起来像一个家庭作业,除了剪切和粘贴之外没有任何努力。
  • 等等,什么?不,不是。这样的事情怎么可能是家庭作业?为了什么?由于我对太空充满热情,因此我正在自己编写一个带有可配置天体的程序。没有人让我这样做。
  • 您应该放弃您的毫秒级 SLA。让它运行,让它运行正确,让它运行得快。发布代码并提出具体问题。在你这样做之前,我们必须假设你没有写任何东西。
  • 我没有写任何东西,因为我没有找到任何解决这个特定问题的方法。我可以写简单的二分法。但我没有,它不会在任何意义上解决我的问题。我为什么要那么做。我想我可能在错误的 stackoverflow 上发布了这个。

标签: math


【解决方案1】:

对于一般的黑匣子功能,这实际上是做不到的。任何对黑盒函数的求根算法都不能保证它找到了所有的根或任何特定的根,即使该函数是连续可微的。

周期性的特性带来了更多的希望,但是您仍然可以在有界域中拥有具有无限多个根的周期性函数。鉴于您的功能与天体有关,这不太可能发生。假设您的周期函数是正弦曲线,我相信您可以检查最短周期的四分之一(在所有周期分量中)的子范围。

也许在最短的季度子范围内尝试Brent's Method


另一种方法是迭代地应用您的求根算法。如果您的范围是 (a, b),则将您的算法应用于该范围以在 c b 处找到根。然后将您的算法应用于范围 (a, c) 以找到该范围内的根。继续直到找不到更多的根。您找到的最后一个根非常适合您的最小根。

【讨论】:

  • 谢谢!可悲的是,我可以遇到tidal lock 的情况,其中两次旋转被取消(在水平坐标上查看)。所以我需要对它进行特殊处理,或者处理它。这就是为什么我不能简单地使用最短的时间。
  • 谢谢!我认为您的解决方案只需多做一些假设即可! (如“最大速度”)
【解决方案2】:

任何范围的黑盒功能?您甚至无法确定它在该范围内具有连续域。您正在寻找什么样的解决方案?自然数、整数、实数、复数?这些都是对答案有很大影响的问题。

所以第一件事应该是确定你接受什么样的数字作为结果。 其次是对函数的石灰有某种保护,因为它会在正负无穷大时试图爆炸你的计算。

由于我们正在触及石灰主题,您的解决方案可能会趋向于零,看起来像一个解决方案,但永远不要触及 0 并成为一个解决方案。这取决于您的误差幅度,必须接近多近才能被认为是好的,这已经足够了。

我认为,对于实数解决方案(我假设那些),您最容易实现赌注是采取一个区间,这个分而治之的算法:

  • 取上下边界和中间值(或无穷小数边界/边界的近似中间值)

    • 尝试用所有 3 个来计算解,并有某种针对无穷大的保护

    • 记住数组中的所有 3 个值及其结果(3 对值)

    • 在单独的变量(一对值和该值的结果)中记住当前的最佳值(最接近解的一个)

    • STEP FORWARD - 重复上述第一个 -2nd 值范围和 2nd -3rd 值范围

    • 有一对最接近解的新值和结果。

    • 清除旧的价值-结果对,用从本次迭代中获得的新价值-结果对替换它们,同时记住最佳价值解决方案对(总计)

重复上述步骤,了解您希望获得的精确程度,并查看每次迭代时内存爆炸的情况,请记住,您将在那里获得指数级增长。如果您可以说采取一个间隔并尽可能深入,记住最佳价值结果对,然后删除所有其他记忆并进入下一个间隔并深入挖掘,则可以进一步改进。

【讨论】:

    猜你喜欢
    • 2018-10-09
    • 2021-09-12
    • 2013-09-28
    相关资源
    最近更新 更多