Язык Си в примерах/Корень уравнения: различия между версиями

Содержимое удалено Содержимое добавлено
Нет описания правки
Нет описания правки
Строка 8:
Вот решение этой задачи:
 
/* root.c: Вычисление корня трансцендентного уравнения */
#include <stdio.h>
#include <math.h>
#define EPS 1e-10 // точность результата
double f(double x) {
return exp(x) - 2 - x;
Строка 18:
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 ); // выводим результат
}
 
Строка 38:
с которой мы хотим найти корень.
 
Алгоритм вычисления корня основан на [[:w:Метод деления попалам|методе деления пополам]].:
А именно Предположим, пустьчто мы знаем, чтоискомый корень функции находится между
<tt>l = 0</tt> и <tt>r = 2</tt>. Найдем середину <tt>c</tt> помежуткапромежутка <tt>[l, r)</tt>.
Корень находится на одном из промежутков: либо на <tt>[l, c)</tt>,
либо на <tt>[с, r)</tt>, а именно, на том, значение функции на концах которого
имеет разные знаки (вспомните [[w:Теорема Ролля|теорему Ролля]] про непрерывную функцию из курса мат. анализа).
Выберем нужный из двух отрезковпромежутков и применим к нему такие же рассуждения.
Будем осуществлять деление попалам, пока размер промежутка не станет меньше необходимой точности.
 
Строка 57:
==Универсальная функция вычисления корня==
 
В рассмотренном нами примерерассмотреннойпрограмме вычисляется нуль вполне конкретной функции: f(x) = exp(x) - 2 - x.
Следуя идеологии [[w:Повторное использование кода|Code reuse]] (повторное использование кода), полезно сделать функцию, которая можетумеет находить нули произвольнойпроизвольных данной функциифункций.
Для этого нужно научится передавать функцию в качестве аргумента --- это возможно, и совсем несложно: