Нахождение корня функции методом половинного деления
Если имеется математическая функция, значение которой в Си вычисляется некоторой функций вида
double f(double x);
и если математическая функция монотонно возрастает или убывает на заданном интервале (a,b), имея на его концах противоположные знаки, то корень функции x можно найти методом половинного деления интервала. Проще говоря, если кривая на интервале (a,b) пересекает ось X, то к этой точке пересечения можно приблизиться, последовательно уменьшая этот интервал путем его деления пополам.
Сущность алгоритма состоит в проверке значения функции на середине интервала. После проверки из двух половинок выбирается та, на концах которых функция имеет разные знаки. Процесс продолжается до тех пор, пока интервал не сократится до заданных размеров, определяющих точность результата:
//------------------------------------------------------bk33-01.cpp
//-----Корень функции по методу середины интервала
double f(double); // Объявление функции f()
double find(double a, double b)
{
double c; // Середина интервала
if (f(a)*f(b) > 0)
return (0.); // Одинаковые знаки
for (; b-a > 0.001;)
{
c = (a+b) / 2; // Середина интервала
if (f(c)*f(a) > 0)
a = c; // Правая половина интервала
else
b = c; // Левая половина интервала
}
return(a); // Возвратить один из концов
} // интервала
В данном примере итерационный характер цикла не очень-то и просматривается. Но положение интервала на новом шаге цикла (правая или левая половина) определяется предыдущим шагом, поэтому итерационность все же присутствует.