Advertisement
Rayzven

bisection

Feb 12th, 2020
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.86 KB | None | 0 0
  1. #include <stdio.h>                  // подключаем к компилятору библиотеку stdio.h;
  2. #include <cmath>                   // подключаем к компилятору библиотеку math.h;
  3. #define EPS 1e-10                   // задаём точность результата 1*10^(-10)
  4.  
  5. using namespace std;
  6.  
  7. double f(double x) {                // задаём вызываемой функции и аргументу - тип двойной точности;
  8.    return exp(x) - 2 - x;           // задаём описание функции f(x);
  9. }
  10.  
  11. int main ( ) {                      // главная часть программы;
  12.    double xl = 0, xr = 2, xm, xd, signfxl, signfxm; // задаём переменным тип двойной длины и начальные значения;
  13.    int n = 0;                       // задаём переменной тип целая и начальное значение;
  14.    xd = xr - xl;                    // вычисляем длину отрезка;
  15.    while ( abs(f(xl))>EPS || abs(f(xr))>EPS ) {  // пока абсолютные значения функции больше заданной точности делаем;
  16.       n = n + 1;                    // прибавляем 1 в счётчик числа проходов (делений на 2, итераций);
  17.       xd = xd / 2;                  // вычисляем длину новых отрезков;
  18.       xm = xl + xd;                 // вычисляем значение x в середине отрезка;
  19.       signfxl = copysign(1, f(xl)); // придаём единице знак f(xl); '''copysign is undefined!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!;'''
  20.       signfxm = copysign(1, f(xm)); // придаём единице знак f(xm); '''copysign is undefined!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!;'''
  21.  
  22.       if ( signfxl != signfxm )     // узнаём, находится ли искомое приближение к корню в левой части;
  23.          xr = xm;                   // берём левую часть;
  24.       else                          // иначе искомое приближение к корню находится в правой части;
  25.          xl = xm;                   // берём правую часть;
  26.    }
  27.  
  28.    printf ("Value of function: %.10lf\n", f(xm));      // выводим значение функции вблизи корня
  29.    printf ("Left bound equal: %.10lf\n", xl );         // выводим xl
  30.    printf ("Middle of line segment: %.10lf\n", (xl + xr) / 2);  // выводим приближение к корню
  31.    printf ("Right bound equal: %.10lf\n", xr );        // выводим xr
  32.    printf ("Numbers of iterations equal: %10i\n", n ); // выводим число проходов (делений на 2, итераций) n
  33. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement