Advertisement
dark-s0ul

Untitled

Dec 19th, 2017
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.48 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3.  
  4. double f(double x) {
  5.     return x * x + 2 * sin(x) - 1;
  6. }
  7.  
  8. double f1(double x) {
  9.     return 2 * (x + cos(x));
  10. }
  11.  
  12. double f2(double x) {
  13.     return 2 - 2 * sin(x);
  14. }
  15.  
  16. double phi(double x, double lambda) {
  17.     return f1(x) > 0.0 ? x - lambda * f(x) : x + lambda * f(x);
  18. }
  19.  
  20. double iterative(double a, double b, double eps, double &delta, unsigned int &iter) {
  21.     double m1 = fabs(f1(a)), M1 = fabs(f1(b));
  22.     if (m1 > M1) {
  23.         double t = m1;
  24.         m1 = M1;
  25.         M1 = t;
  26.     }
  27.     double x0, xk = (a+b)/2, lambda = 1.0/M1, q = 1.0 - m1/M1;
  28.     iter = 0;
  29.  
  30.     do {
  31.         x0 = xk;
  32.         xk = phi(x0, lambda);
  33.         iter++;
  34.     } while (fabs(xk-x0) > (1-q)/q*eps);
  35.     delta = fabs(xk-x0)*q/(1-q);
  36.  
  37.     return xk;
  38. }
  39.  
  40. double tangents(double a, double b, double eps, double &delta, unsigned int &iter) {
  41.     double m1 = fabs(f1(a)), M1 = fabs(f1(b)), xk;
  42.     if (m1 > M1) {
  43.         double t = m1;
  44.         m1 = M1;
  45.         M1 = t;
  46.     }
  47.     xk = f(a)*f2(a) > 0 ? a : b;
  48.     iter = 0;
  49.  
  50.     do {
  51.         xk = xk - f(xk)/f1(xk);
  52.         iter++;
  53.     } while (fabs(f(xk))/m1 > eps);
  54.     delta = fabs(f(xk))/m1;
  55.  
  56.     return xk;
  57. }
  58.  
  59. void Iterative(double a, double b) {
  60.     printf("|  eps  | equation root | accuracy estimation for I |\n");
  61.     for (double eps = 1e-2, delta = 0; eps > 1e-14; eps *= 1e-3) {
  62.         unsigned int iterations;
  63.         double x = iterative(a, b, eps, delta, iterations);
  64.         printf("| %.0e | %13.10f | %25.23f |\n", eps, x, delta);
  65.     }
  66.     printf("\n");
  67. }
  68.  
  69. void Tangents(double a, double b) {
  70.     printf("|  eps  | equation root | accuracy estimation for T |\n");
  71.     for (double eps = 1e-2, delta; eps > 1e-14; eps *= 1e-3) {
  72.         unsigned int iterations;
  73.         double x = tangents(a, b, eps, delta, iterations);
  74.         printf("| %.0e | %13.10f | %25.23f |\n", eps, x, delta);
  75.     }
  76.     printf("\n");
  77. }
  78.  
  79. void Compare(double a, double b) {
  80.     printf("|  eps  | iteration count for I | iteration count for T |\n");
  81.     for (double eps = 1e-2, delta; eps > 1e-14; eps *= 1e-3) {
  82.         unsigned int iterations1, iterations2;  
  83.         iterative(a, b, eps, delta, iterations1);
  84.         tangents(a, b, eps, delta, iterations2);
  85.         printf("| %.0e | %21d | %21d |\n", eps, iterations1, iterations2);
  86.     }
  87.     printf("\n");
  88. }
  89.  
  90. int main() {
  91.     Iterative(-2, -1.5);
  92.     Tangents(-2, -1.5);
  93.     Iterative(0, 0.5);
  94.     Tangents(0, 0.5);
  95.     Compare(-2, -1.5);
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement