我想找到
在给定范围内的黑盒函数。
该功能具有以下属性:
(如果可以用较弱的假设完成,那就更好了)
获得root和极值的最快方法是什么?
我是否需要更多假设或函数范围?
我知道我可以使用root-finding algorithm。我不知道的是如何有效地找到第一个根。
它需要足够快,以便它可以在几毫秒内运行,精度为1.0,范围为1.0e + 8,这就是问题所在。
由于范围可能非常大而且应该足够精确,所以我不能通过检查所有可能的子范围来强制它。
我考虑了bisection method,但如果函数在该范围内只有一个大根,则找到第一个根太慢,因为应该检查每个子范围。
如果解决方案是在java中,那么它更可取,但任何类似的语言都可以。
我想计算任意天体到达一定高度的时间。
它是一个配置定义的虚拟对象,因此我无法假设该对象。
由于涉及各种坐标,因此不容易得到解析解或简单逼近。
我决定为此找到一个数值解决方案。
答案 0 :(得分:0)
对于一般的黑匣子功能,这不可能真的完成。黑盒函数上的任何根查找算法都不能保证它已找到所有根或任何特定的根,即使该函数是连续且可微分的。
定期的属性给了更多希望,但是你仍然可以在有界域中具有无限多个根的周期函数。鉴于你的功能与天体有关,这种情况不太可能发生。假设你的周期函数是正弦函数,我相信你可以在最短周期的四分之一(从所有周期成分中)检查子范围。
也许在最短的四分之一周期子范围内尝试Brent's Method?
另一种方法是迭代应用根寻找算法。如果你的范围是( a , b ),那么将你的算法应用到该范围,以找到一个根 c < B'/ em>的。然后将算法应用于范围( a , c )以查找该范围内的根。继续,直到找不到根。您找到的最后一个根是最小根的一个很好的候选者。
答案 1 :(得分:0)
任何范围的黑匣子功能?你甚至无法确定它是否具有该范围内的连续域。你在寻找什么样的解决方案?自然数,整数,实数,复数?这些都是对答案产生重大影响的问题。
所以第一件事应该是确定你接受什么样的数字作为结果。 其次是对某些功能的石灰进行某种保护,这种保护会试图在你的计算中出现正负无穷大的爆炸。
由于我们正在触及石灰主题,您可以让您的解决方案边缘趋于零,看起来像一个解决方案,但永远不会触及0并成为一个解决方案。这取决于你的误差范围,有多接近被认为是好的,这已经足够了。
我认为,对于实际数字解决方案(我假设那些),最简单的实施下注是采取间隔并且划分和征服算法:
获取上边框和中间值(或无穷小数点边框/边框的大约中间值)
尝试使用全部3来计算解决方案,并对无限性进行某种保护
记住数组中包含结果的所有3个值(3对值)
记住单独变量中的当前最佳值(最接近解决方案的值)(一对值和该值的结果)
前进步骤 - 重复上述第2个值范围和第2个-3值范围
有一对新的值和结果最接近解决方案。
清除旧的值 - 结果对,将其替换为从此迭代中获得的新值 - 同时记住最佳值解决方案对(总计)
重复上面的内容,了解您希望获得的精确程度,并观察每次迭代时内存爆炸的情况,请记住,您将在那里进行指数级增长。可以进一步改进,如果你让我们说一个间隔,并尽可能深入,记住最佳的价值 - 结果对,然后删除所有其他记忆,然后去下一个间隔深挖。