Advertisement
dark-s0ul

lab2

Jan 3rd, 2018
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.10 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3.  
  4. double AntiDerivative(double x) {
  5.     return x * x + 2 * sin(x) - 1;
  6. }
  7.  
  8. double FirstDerivative(double x) {
  9.     return 2 * (x + cos(x));
  10. }
  11.  
  12. double SecondDerivative(double x) {
  13.     return 2 - 2 * sin(x);
  14. }
  15.  
  16. double Phi(double x, double lambda) {
  17.     return FirstDerivative(x) > 0.0 ? x - lambda * AntiDerivative(x) : x + lambda * AntiDerivative(x);
  18. }
  19.  
  20. double Iterative(double a, double b, double eps, double &delta, unsigned int &iterations) {
  21.     double m1, M1;
  22.     if (fabs(FirstDerivative(a)) >= fabs(FirstDerivative(b))) {
  23.         m1 = fabs(FirstDerivative(b));
  24.         M1 = fabs(FirstDerivative(a));
  25.     } else {
  26.         m1 = fabs(FirstDerivative(a));
  27.         M1 = fabs(FirstDerivative(b));
  28.     }
  29.  
  30.     double xk = (a + b) * 0.5;
  31.     double lambda = 1.0 / M1;
  32.     double q = 1.0 - m1 * lambda;
  33.     double t = q / (1 - q);
  34.     iterations = 0;
  35.  
  36.     do {
  37.         double x0 = xk;
  38.         xk = Phi(x0, lambda);
  39.         iterations++;
  40.         delta = fabs(xk - x0) * t;
  41.     } while (delta > eps);
  42.  
  43.     return xk;
  44. }
  45.  
  46. double Tangets(double a, double b, double eps, double &delta, unsigned int &iterations) {
  47.     double m1;
  48.     if (fabs(FirstDerivative(a)) >= fabs(FirstDerivative(b))) {
  49.         m1 = fabs(FirstDerivative(b));
  50.     } else {
  51.         m1 = fabs(FirstDerivative(a));
  52.     }
  53.     double xk = AntiDerivative(a) * SecondDerivative(a) > 0 ? a : b;
  54.     iterations = 0;
  55.  
  56.     do {
  57.         xk -= AntiDerivative(xk) / FirstDerivative(xk);
  58.         iterations++;
  59.         delta = fabs(AntiDerivative(xk)) / m1;
  60.     } while (delta > eps);
  61.  
  62.     return xk;
  63. }
  64.  
  65. void FindRoots(double a, double b, double step, double *X, int count) {
  66.     int n = (int((b - a) / step) >> 1) << 1;
  67.     step = (b - a) / (double) n;
  68.  
  69.     for (int i = 0, roots = 0; (i < n) && (roots < count); i++) {
  70.         double x = a + i * step;
  71.         if (AntiDerivative(x) * AntiDerivative(x + step) < 0) {
  72.             X[roots++] = x;
  73.         }
  74.     }
  75. }
  76.  
  77. int main() {
  78.     double X[2];
  79.     FindRoots(-2, 1, 0.1, X, 2);
  80.  
  81.     for (int i = 0; i < 2; i++) {
  82.         double x = X[i];
  83.  
  84.         printf("|  eps  |      equation root      | Iterative accuracy |\n");
  85.         for (double eps = 1e-2, delta = 0; eps > 1e-14; eps *= 1e-3) {
  86.             unsigned int iterations;
  87.             double y = Iterative(x, x + 0.1, eps, delta, iterations);
  88.             printf("| %.0e | %23.20f | %.12e |\n", eps, y, delta);
  89.         }
  90.         printf("\n");
  91.     }
  92.  
  93.     for (int i = 0; i < 2; i++) {
  94.         double x = X[i];
  95.  
  96.         printf("|  eps  |      equation root      |  Tangets accuracy  |\n");
  97.         for (double eps = 1e-2, delta; eps > 1e-14; eps *= 1e-3) {
  98.             unsigned int iterations;
  99.             double y = Tangets(x, x + 0.1, eps, delta, iterations);
  100.             printf("| %.0e | %23.20f | %.12e |\n", eps, y, delta);
  101.         }
  102.         printf("\n");
  103.     }
  104.  
  105.     printf("|  eps  | Iterative iteration | Tangets iteration |\n");
  106.     for (double eps = 1e-2, delta, x = X[0]; eps > 1e-14; eps *= 1e-3) {
  107.         unsigned int iterations1, iterations2;  
  108.         Iterative(x, x + 0.1, eps, delta, iterations1);
  109.         Tangets(x, x + 0.1, eps, delta, iterations2);
  110.         printf("| %.0e | %19d | %17d |\n", eps, iterations1, iterations2);
  111.     }
  112.     printf("\n");
  113. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement