Advertisement
Guest User

Untitled

a guest
Sep 17th, 2019
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.22 KB | None | 0 0
  1. #include <cmath>
  2. #include <stdlib.h>
  3. #include <iostream>
  4. #include <windows.h>
  5. using namespace std;
  6.  
  7. double Round(double X, double Delta) {
  8.     if (Delta <= 1E-9) {
  9.         puts("Неверное задание точности округления\n");
  10.         exit(1);
  11.     }
  12.  
  13.     if (X > 0.0) {
  14.         return Delta * long(X / Delta + 0.5);
  15.     } else {
  16.         return Delta * long(X / Delta - 0.5);
  17.     }
  18. }
  19.  
  20.  
  21. double F(double x) {
  22.     double s;
  23.     s = asin((2*x)/(1+x*x))-exp(-(x*x));
  24.     return s;
  25. }
  26.  
  27. double BISECT(double Left, double Right, double Eps, int &N, double Delta, bool Err) {
  28.     double E = fabs(Eps) * 2.0;
  29.     double FLeft = F(Left);
  30.     double FRight = F(Right);
  31.     if (Err) //симуляция ошибок (неточности) во входных данных
  32.     {
  33.         FLeft = Round(FLeft, Delta);
  34.         FRight = Round(FRight, Delta);
  35.     }
  36.     double X = 0.5 * (Left + Right);
  37.     double Y;
  38.  
  39.     if (FLeft * FRight > 0.0) {
  40.         puts("Неверное задание интервала\n");
  41.         exit(1);
  42.     }
  43.  
  44.     if (Eps <= 0.0) {
  45.         puts("Неверное задание точности\n");
  46.         exit(1);
  47.     }
  48.  
  49.     if (FLeft == 0.0) {
  50.         return Left;
  51.     }
  52.  
  53.     if (FRight == 0.0) {
  54.         return Right;
  55.     }
  56.  
  57.     for (N = 0; Right - Left >= E; N++) {
  58.         X = 0.5 * (Right + Left);   // вычисление середины отрезка
  59.         Y = F(X);
  60.         if (Err)
  61.             Y = Round(Y, Delta);
  62.  
  63.         if (Y == 0.0) {
  64.             return X;
  65.         }
  66.  
  67.         if (Y * FLeft < 0.0) {
  68.             Right = X;
  69.         } else {
  70.             Left = X;
  71.             FLeft = Y;
  72.         }
  73.     }
  74.     return X;
  75. }
  76.  
  77. int main()
  78. {
  79.     SetConsoleOutputCP(CP_UTF8);
  80.     double Eps, Left, Right;
  81.     int N;
  82.     int cond = 0;
  83.     cout << "Введите точность Eps" << endl;
  84.     cin >> Eps;
  85.     cout << "Введите координату x левого конца отрезка" << endl;
  86.     cin >> Left;
  87.     cout << "Введите координату x правого конца отрезка" << endl;
  88.     cin >> Right;
  89.     cout << "Введите 1, чтобы найти x: f(x)=0 методом бисекции без моделирования ошибок в исходных данных" << endl;
  90.     cout << "Введите 2, чтобы моделировались ошибки в исходных данных" << endl;
  91.     cin >> cond;
  92.     switch (cond)
  93.     {
  94.         case 1:
  95.             cout << "f(x)=0, x=" << BISECT(Left, Right, Eps, N, 0, false) << endl;
  96.             cout << "Количество итераций: " << N << endl;
  97.             break;
  98.         case 2:
  99.             double Delta;
  100.             cout << "Введите точность округления значения функции для моделирования ошибок" << endl;
  101.             cin >> Delta;
  102.             BISECT(Left, Right, Eps, N, Delta, true);
  103.             cout << "f(x)=0, x=" << BISECT(Left, Right, Eps, N, Delta, true) << endl;
  104.             cout << "Количество итераций: " << N << endl;
  105.             break;
  106.         default:
  107.             cout << "Неверный ввод" << endl;
  108.     }
  109.  
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement