Отделение корней может осуществляться графически или программным путем.
а) Теорема.
Если на отрезке [a,b] функция y=F(x) определена и непрерывна, и на его концах принимает значения разных знаков (т.е. F(a)F(b)<0), то уравнение F(x)=0 имеет на этом отрезке, по крайней мере, один корень.
Если функция y=F(x) на отрезке [a,b] строго монотонна, то корень единственный.
Требуется указать отрезок, содержащий нуль функции.
Например, пусть требуется отделить корни уравнения x2-x-1=0. Построим график функции y=x2-x-1 и укажем отрезки, содержащие точки пересечения графика функции с осью абсцисс.
Искомые промежутки: [-1; 0] [1; 2].
б) Иногда проще рассмотреть вместо уравнения y=F(x) равносильное ему уравнение f1(x)=f2(x). В этом случае требуется указать отрезок, содержащий абсциссу точки пересечения графиков функций y=f1(x) и y=f2(x).
Например, пусть требуется отделить корни уравнения x2-x-1=0. Рассмотрим равносильное ему уравнение x2=x+1. Тогда вместо отрезков, содержащих точки пересечения графика функции y=x2-x-1 с осью абсцисс, можно указать отрезки, содержащие точки пересечения графиков функций f1(x)=x2 и f2(x)=x+1.
Искомые промежутки: [-2; 0] [1; 3].
Пусть имеется уравнение F(x)=0, причем все корни находятся на отрезке [a,b]. Будем вычислять все значения функции y=F(x), начиная с точки x=a, двигаясь вправо шагом h. Если функция на отрезке длины h меняет знак (т.е. F(a)F(b)<0) и монотонна, можно считать, что на этом отрезке ровно 1 корень.
Правильность нахождения отрезков, содержащих один корень, зависит от характера функции y=F(x) и от величины шага h. При выборе шага должна соблюдаться «золотая середина», т.к. шаг h должен быть с одной стороны достаточно малым, чтобы не произошло потери корней, а с другой стороны не настолько маленьким, чтобы число отрезков не было слишком большим.
Блок-схема отделения корней:
Программа отделения корней:
program otd_korn;
var x1,x2,a,b,h:real;
function f(x: real):real;
begin {записать, функцию в виде f:=[математическое выражение]} f:=x*x*x-x+4;
end;
begin
write('Введите левую границу отрезка - a: ');readln(a);
write('Введите правую границу отрезка - b: ');readln(b);