StoneHaos

alexey_mod1

Mar 1st, 2021
469
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <math.h>
  3. #include <utility>
  4. using namespace std;
  5.  
  6. typedef pair<double, double> cut;
  7. const double dx = 0.0001;
  8.  
  9. double f(double x) {
  10.     return pow(sin(x), 2.0) / (2.0 + sin(x));
  11. }
  12.  
  13. double f_(double x) {
  14.     return (f(x + dx) - f(x)) / dx;
  15. }
  16.  
  17. double f__(double x) {
  18.     return (f_(x + dx) - f_(x)) / dx;
  19. }
  20.  
  21. cut Sven(double x0, double h) {
  22.     int k = 1;
  23.     double x1, x2;
  24.     if (f(x0 - h) >= f(x0) && f(x0) >= f(x0 + h)) {
  25.         x1 = x0 + h;
  26.     }
  27.     else if (f(x0 - h) <= f(x0) && f(x0) <= f(x0 + h)) {
  28.         x1 = x0 - h;
  29.         h = -h;
  30.     }
  31.     else if (f(x0 - h) <= f(x0) && f(x0) >= f(x0 + h)) {
  32.         x1 = x0 + h;
  33.     }
  34.     else {
  35.         return cut(x0 - h, x0 + h);
  36.     }
  37.  
  38.     x2 = x1;
  39.     x1 = x0;
  40.     do {
  41.         x0 = x1;
  42.         x1 = x2;
  43.         x2 = x1 + pow(2.0, k * 1.0) * h;
  44.         k++;
  45.     } while (f(x2) <= f(x1));
  46.  
  47.     if (h > 0) {
  48.         return cut(x0, x2);
  49.     }
  50.     else {
  51.         return cut(x2, x0);
  52.     }
  53. }
  54.  
  55. double Newton(cut c, double eps) {
  56.     double x0, x1 = (c.first + c.second) / 2.0;
  57.     do {
  58.         x0 = x1;
  59.         x1 = x0 - f_(x0) / f__(x0);
  60.     } while (abs(x1 - x0) > eps);
  61.     return x1;
  62. }
  63.  
  64.  
  65. ostream& operator<<(ostream& out, cut c) {
  66.     out << "(" << c.first << "," << c.second << ")";
  67.     return out;
  68. }
  69.  
  70. int main(void) {
  71.     cut a = Sven(4, 0.1);
  72.     cout << a << endl;
  73.     cout << Newton(a, 0.001) << endl;
  74.     return 0;
  75. }
RAW Paste Data