我需要找到形式为的零。我尝试使用牛顿法,它有时会起作用,但它高度依赖于初始选择,并且由于函数“几乎”平坦,发散的机会非常高。
找到这种函数的零点的最佳方法是什么?
现在,我用割线法代替了牛顿法,似乎效果更好。
我需要找到形式为的零。我尝试使用牛顿法,它有时会起作用,但它高度依赖于初始选择,并且由于函数“几乎”平坦,发散的机会非常高。
找到这种函数的零点的最佳方法是什么?
现在,我用割线法代替了牛顿法,似乎效果更好。
在我的脑海中,有很多事情可能会出错。您可能需要验证以下内容
您正在计算的函数值或导数在数值上是否稳定?他们评估中的舍入误差是否平滑?您可以通过在已知根周围绘制一个非常小的间隔来直观地验证这一点,使得函数值为。如果您的函数或导数在根附近更改符号,则牛顿法将不起作用。
您使用什么终止标准?如果你正在寻找一个根与,你会在或 where是你的承受能力吗?在这两种情况下,您选择的理由是什么?它与您在前一点观察到的错误/间隔如何匹配?
牛顿法是一把好锤子,但有很多函数看起来很像你的拇指。对于在搜索区间中几乎是线性的函数,割线法是一个不错的选择,但一旦您离开该假设,性能就会很差。一个很好的替代方案是所谓的伊利诺伊算法。区间方法的一个主要优点是它们不依赖于函数或其任何导数在数值上是平滑的,因为您可以运行它们直到或直到搜索区间在数值上为零,即。
你能约束你的零吗?如果您可以为零的近似位置提出一个好的启发式算法,然后在不太大的间隔内为其计算边界,那么许多方法的性能都会得到提高。这是我用来为单调函数执行基本根括号的一些 Matlab 代码。
在区间方法方面,@Pedro 建议使用伊利诺伊算法是一个很好的简单可能性。如果要大锤,当然有布伦特的方法,实现起来比较复杂。它是 Matlab 的基础fzero
。
使用线搜索或信任域方法以及牛顿法通常可以可靠地找到零点。检查任何高级数值方法或优化书。