Advertisement
StoneHaos

1

Jan 27th, 2022
737
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <algorithm>
  5. #include <utility>
  6. #include <math.h>
  7.  
  8. using namespace std;
  9.  
  10. typedef pair<double, double> pdd;
  11. const double dx = 0.0001;
  12.  
  13. double f(double x) {
  14.     return log(cos(x)) + cos(x);
  15. }
  16.  
  17.  
  18. void print(pdd p) {
  19.     cout << p.first << " " << p.second << endl;
  20. }
  21.  
  22.  
  23. pdd SvenMax(double x0, double h) {
  24.     double f1 = f(x0);
  25.     double f2 = f(x0 + h);
  26.     double f0 = f(x0 - h);
  27.     int k = 1;
  28.     double x1, x2;
  29.  
  30.     if (f0 >= f1 && f1 >= f2) {
  31.         x1 = x0 - h;
  32.         h = -h;
  33.     }
  34.     else if (f0 <= f1 && f1 <= f2) {
  35.         x1 = x0 + h;
  36.     }
  37.     else {
  38.         return pdd(x0 - h, x0 + h);
  39.     }
  40.  
  41.     x2 = x1;
  42.     x1 = x0;
  43.     do {
  44.         x0 = x1;
  45.         x1 = x2;
  46.         x2 = x1 + pow(2, 1.0 * k) * h;
  47.         k++;
  48.     } while (f(x2) >= f(x1));
  49.    
  50.     if (h > 0) {
  51.         return pdd(x0, x2);
  52.     }
  53.     else {
  54.         return pdd(x2, x0);
  55.     }
  56.  
  57. }
  58.  
  59. double PD(pdd t, double e) {
  60.     double a = t.first;
  61.     double b = t.second;
  62.     double x1, x2;
  63.     double xc = (a + b) / 2;
  64.     double l = b - a;
  65.     while (l > e) {
  66.         x1 = a + l / 4;
  67.         x2 = b - l / 4;
  68.         if (f(x1) > f(xc)) {
  69.             b = xc;
  70.             xc = x1;
  71.         }
  72.         else if (f(x2) > f(xc)) {
  73.             a = xc;
  74.             xc = x2;
  75.         }
  76.         else {
  77.             a = x1;
  78.             b = x2;
  79.         }
  80.         l = b - a;
  81.     }
  82.     return xc;
  83. }
  84.  
  85. int main(void) {
  86.    
  87.     pdd a = SvenMax(-1, 1);
  88.     cout << "cut: ";
  89.     print(a);
  90.  
  91.     double b = PD(a, 0.00001);
  92.     cout << "max: ";
  93.  
  94.     cout << "(" << b << ";" << f(b) << ")" << endl;
  95.     return 0;
  96. }
Advertisement
Advertisement
Advertisement
RAW Paste Data Copied
Advertisement