【概述】
三分法是二分法的扩展,其用于求凸性或凹形函数的极值,当通过函数本身表达式并不容易求解时,就可以用三分查找来不断逼近求解。
其原理为:函数中存在一个点 x 是最值,对于 x 的左边,满足单调上升(下降),右边满足单调下降(上升),然后进行两次二分,使得不断的逼近这个 x 点,最后求得答案。
【基本思想】
类似二分的定义 Left 和 Right,对于 [L,R],先找出 lmid,紧接着再找出 rmid,然后比较两者谁更优,然后舍去不优的。
- mid=Left+(Left-Right)/3
- mid_mid=Right-(Right-Left)/3
若 lmid 靠近极值点,则 Right=rmid,若 rmid 靠近极值点,则 Left=lmid;
要注意的是,若在三分过程中,遇到 f(lmid)=f(rmid) 时,若函数严格单调,那么令 left=lmid 或令 right=rmid 均可,若函数不严格单调,即在函数中存在一段函数值相等的区间,将无法判断定义域左右边界该如何缩小,三分法也就不再适用。
【查找连续函数的写法】
/*查找函数最大值*/
int BinarySearch(double low,double high){//low为区间下界,high为区间上界
double left,right,mid;
left=low;//设置当前查找区间上界的初值
right=high;//设置当前查找区间下界的初值
while(right-left>1.0e-6) {
mid=(max+min)/2;//设置中值
mid_mid=(mid+max)/2;//设置中值
if(Caculate(mid)<Caculate(mid_mid))//若函数结果左值小于右值
left=mid;//调整集合下界
else//否则
right=mid_mid;//调整集合上界
}
return Caculate(mid);
}