查找函数的根,例如3 +余弦( x ) + 0.005 / ( x - a )3+cos⁡(x)+0.005/(x−a)?

计算科学
2021-11-29 16:32:29

我有一个黑盒函数(就这个问题而言)看起来像的位置未知(但在内)。只是一个(不好的)近似值。)我需要找到这个函数的根。不幸的是,函数形式太复杂而无法分析(它涉及超几何函数),所以没有直接的括号可以找到根。所以我有点坚持。3+cos(x)+0.005/(xa)a02π3+cos(x)

到目前为止我的想法:

  • 生成一个紧密排列的网格,可以看到一个小凹凸。附近。(当网格的元素差异符号发生变化时,进一步优化该区域。)x=a
  • 做一些优化算法来找到(?)a
  • 括号左右从找到根。a

关于如何解决这个问题的想法?

3个回答

我建议您对函数进行采样并为样本拟合一个有理函数。您可以在有理函数的极点中找到,在实零点中找到根。a

有许多很好的方法可以找到有理函数拟合,并且只需少量样本,它们就可以为此类函数提供极其准确的近似值。

您可以使用的一些软件包是:矢量拟合: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_methodhttps://en.wikipedia.org/wiki/Brent%27s_method

如果您可以计算函数的导数,那么您需要使用牛顿法。

每本关于数值方法或数值分析的教科书都会讨论这些方法。事实上,有一篇关于这个主题的完整维基百科文章:https ://en.wikipedia.org/wiki/Root-finding_algorithms

据我了解,你的功能(称之为f(x)) 只有一个简单的极点x=a并且可能超过一个零,并且a不知道,除了它在[0,2π]. 另外,你不知道f(x)以分析形式,这意味着您无法通过分析来区分它。鉴于这一切,我建议如下:

  1. 决定a通过对方程应用根查找器1/f(x)=0. (我认为重要的是a准确地确定,因为它的准确度会影响零点的准确度f(x).)
  2. 确定后a, 应用根查找器f(x)=0(或更好,(xa)f(x)=0(?)) 找到零f(x).

当然,您只能使用不涉及导数的根查找器f(x). 在这种情况下,我会建议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下载 我希望这个帮助您解决问题。