Раздел «Язык Си».EquationRoot:

Корень уравнения

Рассмотрим уравнение, которое не имеет явной формулы для корня: e^x = x - 2. С помощью компьютера можно найти положительный корень этого уравнения с точностью до 10 знаков после запятой, то есть с погрешностью не более 10^{-10}.

Вот решение этой задачи:

/* Вычисление корня трансцендентного уравнения */
#include <stdio.h>
#include <math.h>
#define EPS 1e-10
double f(double x)
{ 
    return exp(x) - 2 - x;
}
void main()
{
   double l = 0, r = 2, c;
   while( r - l > EPS )
   {
      c = ( l + r ) / 2;
      if( f(c) * f(r) < 0 ) l = c;
      else r = c; 
   }
   printf ("%.10lf\n", (l + r)/2 );
}

При компиляции этой программы с помощью GCC следует указать опциею -lm, чтобы при линковщик подключил библиотеку mlib с математическими функциями:

bash$ gcc -lm root.c -o root
В библиотеке mlib, в частности, определена функция exp, вычисляющая экспоненту, а также многие другие математические функции: тригонометричекие, корень, степень, логарифм, ...

Директива #define EPS 1e-10 означает: везде, где встречается комбинация EPS заменить её на число 1e-10, то есть 1\cdot 10^{-10}. Число EPS — это погрешность, с которой мы хотим найти корень.

Алгоритм вычисления корня основан не методе деления пополам. А именно, пусть мы значем, что корень функции находится между l=0 и r=2. Найдем середину c отрезка [l, r). Корень находится на одном из промежутков: либо на [l,c), либо на [с, r), а именно на том, значение функции на концах которого имеет разные знаки (вспомните теорему Ролля из курса мат. анализа). Выберем нужный из двух отрезков и применим к нему те же рассуждения. Будем заниматься делением попалам, пока размер отрезка не станет меньше необходимой точности.

Вопросы и задачи