Brent‘s method

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、需保证|f(b)|\leq \left | f(a) \right |,即若|f(b_{0})|\leq \left | f(a_{0}) \right |,令b=b_{0},a=a_{0},c=a_{0};|f(b_{0})|> | f(a_{0}) |,令b=a_{0},a=b_{0},c=b_{0};

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.

声明:本人水平不足,能力有限,若有错误,欢迎批评指正,希望读者不吝赐教,万分感谢!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值