三分可以用来求单峰函数的极值。
首先对一个函数要使用三分时,必须确保该函数在范围内是单峰的。
又因为凸函数必定是单峰的。
证明一个函数是凸函数的方法:
所以就变成证明该函数的一阶导数是否单调递增,或者其二阶导数是否大于0。
#include<stdio.h> #include<math.h> const double eps=1e-8; double js(double x,double y){ return 6*pow(x,7)+8*pow(x,6)+7*pow(x,3)+5*pow(x,2)-y*x; } int main(){ int n; double x,y,mmid,mid,l,r; while(~scanf("%d",&n)){ while(n--){ scanf("%lf",&y); l=0,r=100; while(r-l>eps){ mid=(l+r)/2; mmid=(mid+r)/2; if(js(mid,y)<js(mmid,y)) r=mmid; else l=mid; } printf("%.4f ",js(mid,y)); } } return 0; }