三分法

来源:互联网 发布:硬笔临贴 知乎 编辑:程序博客网 时间:2024/05/04 00:14

*使用范围:

我们知道二分法可以用来求单调函数的零点

三分法就是用来求单峰函数的极值



*怎么做?(波峰波谷都可以)


1.先求出L和R的中点mid
2.再求出mid和L的中点mmid
3.比较f(mid)和f(mmid)的大小
      if (f(mid) > f(mmid)) L = mmid;

      else R = mid;


模板:(波谷,求最小值)

void bs(double y){    double l=min,r=max;    double mid,mmid,k=0;    while(l+eps<r){        mid=(l+r)/2;        mmid=(l+mid)/2;        if(f(mid,y)<f(mmid,y))            l=mmid;        else{            r=mid;            k=r;        }    }    printf("%.4lf\n",f(k,y));}



算法的正确性:
1、mid与mmid在最值的同一侧。由于凸性函数在最大值(最小值)任意一侧都具有单调性,因此,mid与mmid中,更大(小)的那个 数自然更为靠近最值。此时,我们远离最值的那个区间不可能包含最值,因此可以舍弃。
2、mid与mmid在最值的两侧。由于最值在中间的一个区间,因此我们舍弃一个区间后,并不会影响到最值


1 0