三分法

三分法 用于求单峰函数顶点

对于已知 [l, r]中函数单峰

求得 [l + (r - l) / 3, r - (r - l) / 3] 即横坐标的两个三等分点

计算这两点的函数值(使用秦九韶即可

较远离顶点的那个(比如向上的峰 就取函数值比较小的那个三等分点)作为下一次的边界

每次把范围缩小三分之一

与找零点的二分法十分类似

 

模板题链接:

 
附上代码:
 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <cstdlib>
 4 #include <cmath>
 5 using namespace std;
 6 const int N = 15;
 7 const double eps = 1e-7;
 8 int n;
 9 double l, r;
10 double a[N];
11 
12 double qjs(double x){
13     double ans = 1.0;
14     for(int i = n; i >= 2; i--)
15         ans = ans * a[i] * x + 1.0;
16     ans = ans * a[1] * x + a[0];
17     return ans;
18 }
19  
20 int main(){
21     scanf("%d%lf%lf", &n, &l, &r);
22     for(int i = n; i >= 0; i--)
23         scanf("%lf", &a[i]);
24     for(int i = n; i >= 2; i--){
25         a[i] /= a[i - 1];
26     }
27     double t1, t2;
28     while(r - l > eps){
29         t1 = l + (r - l) / 3;
30         t2 = r - (r - l) / 3;
31         if(qjs(t1) > qjs(t2)) r = t2;
32         else l = t1;
33     }
34     printf("%.5lf", l);
35     return 0;    
36 }
View Code

 

posted @ 2018-08-05 17:09  hjmmm  阅读(319)  评论(0编辑  收藏  举报