Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЧМ_1-5.doc
Скачиваний:
14
Добавлен:
25.08.2019
Размер:
595.46 Кб
Скачать

II. Отделения корней программным способом.

Пусть имеется уравнение 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);

write('Введите шаг - h:'); readln(h);

x1:=a; x2:=x1+h;

while x2<b do

begin

if f(x1)*f(x2)<0

then writeln('[ ',x1:6:2,' , ',x2:6:2,' ]');

x1:=x2; x2:=x1+h;

end;

readln;

end.

Блок-схема отделения корней:

Результаты выполнения программы:

Введите левую границу отрезка - a: -100

Введите правую границу отрезка - b: 100

Введите шаг - h:1

[ -2.00 , -1.00 ]

Уточнение корней

Уточнение корней может осуществляться различными методами.

Метод половинного деления

Пусть 1) функция y=F(x) определена и непрерывна на отрезке [a,b].

2) F(a)F(b)<0

Требуется найти корень на отрезке с точностью ε.

Разделим отрезок [a,b] пополам точкой . Если , то возможны два случая: 1) F(x) меняет знак на отрезке [a; c];

2) F(x) меняет знак на отрезке [c; b].

Выбираем тот отрезок, на котором функция меняет знак. Если F(x) меняет знак на отрезке [a; c], то b:=c; если F(x) меняет знак на отрезке [c; b], то a:=c.

Условие окончания счета: .

Корень уравнения: . Погрешность метода: .

Рассмотрим положительные и отрицательные стороны метода половинного деления.

«Плюсы»:

«Минусы»:

  • надежность

  • не требует приведения к специальному виду

  • не требует дифференцируемости функции

  • устойчив к ошибкам округления

  • медленная сходимость

  • м етод не применим для корней четной кратности:

Программа уточнения корней методом половинного деления:

program pol_del;

var a,b,c,e,x,dX: real;

N:integer;

function f(x: real):real;

begin

{записать, функцию в виде f:=[математическое выражение]}

f:=x*x*x-x+4;

end;

begin

write('Введите левую границу отрезка - a: ');readln(a);

write('Введите правую границу отрезка - b: ');readln(b);

write('Введите требуемую погрешность - e:'); readln(e);

N:=0;

repeat N:=N+1; c:=(a+b)/2;

if f(a)*f(c)<0 then b:=c else a:=c;

until b-a<e;

x:=(a+b)/2; dX:=(b-a)/2;

writeln('Приближенное значение корня - Х = ',x);

writeln('Ошибка не превышает dX = ',dX);

writeln('Число итераций - N = ',N);

readln

end.

Блок-схема уточнения корней методом половинного деления:

Результаты выполнения программы:

Введите левую границу отрезка - a: -2

Введите правую границу отрезка - b: -1

Введите требуемую погрешность - e:.0001

Приближенное значение корня - Х = -1.7962951660E+00

Ошибка не превышает dX = 3.0517578125E-05

Число итераций - N = 14