Brent's method 是一种结合了二分法、线性插值和逆二次插值的混合算法,用于寻找给定区间函数的零点。该方法优先使用逆二次插值,其次线性插值,以上两种方法均不能使用的情况下选择二分法,换句话来讲,二分法就是用来兜底的。下面依据三种方法的优先级依次进行介绍:
逆二次插值:假设给定三个点(a,f(a)),(b,f(b)),(c,f(c)),a,b,c互不相等,f(a)、f(b)、f(c)互不相等切不为零,则满足逆二次插值的条件,插值点m为:
线性插值:给定区间[a,b],端点处函数值为f(a),f(b),插值点m为:
二分法:给定区间[a,b],端点处函数值为f(a),f(b),中点m为:m=(a+b)/2;
Brent's method 原理
变量更新原则:b为迭代过程中最接近零点的一点,a为原本的b,c与b构成含有零点的区间。
1、初始化
a、输入函数f,给定区间[a0,b0],需满足f(a0)f(b0)<0,即函数f在区间[a0,b0]内有零点;
b、需保证,即若
,令
;
,令
;
2、进行迭代
根据三种方法的优先级,首先采用逆二次插值进行迭代计算(需要注意的是,由于第一次迭代时a=c,所以不能使用逆二次插值):检验三个变量是否符合逆二次插值的条件,若符合,采用上述公式计算插值点m,接着进行插值点m的有效性检验:
(1)、m位于当前区间内;(2)、步长不超过当前区间长度的3/4,即;(3)、分母的绝对值大于机器的精度。
若以上三点均满足,则按照变量更新原则进行变量更新;若不符合或者以上任意一点不满足,则进行线性插值,采用上述线性插值公式计算插值点m,对m进行有效性检验:
(1)、位于区间内;(2)、插值步长不超过区间长度的一半,即;(3)、分母不为零;
若以上三点均满足,则按照变量更新原则进行变量更新;若以上任意一点不满足,则进行二分法,同样按照变量更新原则进行变量更新。
变量更新后进入终止条件检验是否终止;
3、终止条件
1)、区间半长小于容差,即;
2)、达到设定精度,
3)、达到最大迭代次数Nmax,。
若满足以上任意一点,则退出迭代,输出零点b;否则,进入2、进行迭代。
程序可直接使用MATLAB中的fzero函数,fzero (mathworks.cn)。
参考文献:
[1] Brent, R., Algorithms for Minimization Without Derivatives, Prentice-Hall, 1973.
声明:本人水平不足,能力有限,若有错误,欢迎批评指正,希望读者不吝赐教,万分感谢!