我有一个黑盒函数(就这个问题而言)看起来像。此的位置未知(但在内)。(只是一个(不好的)近似值。)我需要找到这个函数的根。不幸的是,函数形式太复杂而无法分析(它涉及超几何函数),所以没有直接的括号可以找到根。所以我有点坚持。
到目前为止我的想法:
- 生成一个紧密排列的网格,可以看到一个小凹凸。在附近。(当网格的元素差异符号发生变化时,进一步优化该区域。)
- 做一些优化算法来找到(?)
- 括号左右从找到根。
关于如何解决这个问题的想法?
我有一个黑盒函数(就这个问题而言)看起来像。此的位置未知(但在内)。(只是一个(不好的)近似值。)我需要找到这个函数的根。不幸的是,函数形式太复杂而无法分析(它涉及超几何函数),所以没有直接的括号可以找到根。所以我有点坚持。
到目前为止我的想法:
关于如何解决这个问题的想法?
我建议您对函数进行采样并为样本拟合一个有理函数。您可以在有理函数的极点中找到,在实零点中找到根。
有许多很好的方法可以找到有理函数拟合,并且只需少量样本,它们就可以为此类函数提供极其准确的近似值。
您可以使用的一些软件包是:矢量拟合:https ://www.sintef.no/projectweb/vectorfitting/
Rational-Krylov 拟合: http: //guettel.com/rktoolbox/examples/html/example_frequency.html
Chebfun中的AAA功能:http: //www.chebfun.org
这是数值分析中的标准问题。如果您无法计算函数的导数,标准方法是使用“二分搜索”,或者,如果您想花哨的话,可以使用黄金比例或 Bent 方法对其进行改进。见https://en.wikipedia.org/wiki/Bisection_method和https://en.wikipedia.org/wiki/Brent%27s_method
如果您可以计算函数的导数,那么您需要使用牛顿法。
每本关于数值方法或数值分析的教科书都会讨论这些方法。事实上,有一篇关于这个主题的完整维基百科文章:https ://en.wikipedia.org/wiki/Root-finding_algorithms
据我了解,你的功能(称之为) 只有一个简单的极点并且可能超过一个零,并且不知道,除了它在. 另外,你不知道以分析形式,这意味着您无法通过分析来区分它。鉴于这一切,我建议如下:
当然,您只能使用不涉及导数的根查找器. 在这种情况下,我会建议generalized secant method'' that I developed for finding simple roots that has order close to 2 (hence efficiency index close to 2 as well) and is easy to apply. You can find it in Wikipedia under the title Sidi 的广义割线法。'' 原论文可以从
http://www.math.nthu.edu.tw/~amen/2008/070227-1.pdf下载
我希望这个帮助您解决问题。