Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Гладков_Кулютникова.doc
Скачиваний:
8
Добавлен:
03.11.2018
Размер:
1.36 Mб
Скачать

Численные методы

Решение конкретных задач часто сводится к нахождению корней уравнения вида

f(x) = 0,

где функция f(x) определена и непрерывна на некотором интервале.

Если f(x) - многочлен, то уравнение называют алгебраическим, если же в f(x) входят тригонометрические, логарифмические, показательные функции, то такое уравнение называют трансцендентное.

Всякое значение х* такое, что f(x*) = 0 называется корнем уравнения, а нахождение этого значения - решение уравнения.

Решение уравнения разбивается на два этапа:

  1. отделение корней, т.е. отыскание достаточно малых областей, в каждой из которых заключен один и только один корень уравнения;

  2. вычисление выделенного корня с заданной точностью.

Для вычисления выделенного корня существует множество методов. В этом пособии будут рассмотрены методы итераций и половинного деления.

Метод итераций

Уравнение f(x) необходимо представить в виде x =  (x). Выберем теперь на участке [a, b] (участок, в котором находится корень уравнения) произвольную точку x0 и последовательно будем вычислять:

x1 = (x0), x2 =  (x1), ... , xk =  (xk-1).

Обычно в качестве x0 выбирают левую границу интервала [a, b].

Процесс последовательного вычисления значений xk (k = 1, 2, ...) по указанным формулам называется итерационным процессом (процессом последовательных приближений).

Задача. Решить уравнение ; отрезок, на котором существует корень, [2; 3].

Преобразуем уравнение .

Var x0, x1, eps: real;

begin

write (‘ введите начальное приближение’);

readln (x0);

write (‘введите абсолютную погрешность’);

readln (eps);

x1 := (3*sin(sqrt(x0)) - 3.8)/0.35;

while abs(x0 - x1) > eps do

begin

x0 := x1;

x1 := 3*sin(sqrt(x0) - 3.8)/0.35

end;

writeln (‘ решение уравнения х =’, x0)

end.

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

Пусть дано уравнение f(x) = 0, где функция f непрерывна на отрезке [a, b] и на концах отрезка имеет разные знаки, т.е. f(a)*f(b)<0. Если непрерывная функция на отрезке меняет знак, то она на этом отрезке имеет, по крайней мере, один корень. Пусть [a, b] выделен так, что на нем имеется только один корень уравнения. Найдем этот корень методом половинного деления.

Для этого разделим отрезок [a, b] пополам и присвоим x1 = (a+b)/2. Если f(x) = 0, то х1 - корень уравнения. Если f(x)  0, то выбираем тот из отрезков [a, x1] или [x1, b], на концах которого f(x) имеет противоположные знаки. Полученный отрезок снова делим пополам и проводим те же рассуждения. Процесс продолжаем до тех пор, пока длина отрезка, на концах которого функция имеет противоположные знаки, не станет меньше заданной точности . Как только длина отрезка станет меньше , любую точку отрезка можно с точностью  принять за корень уравнения f(x) = 0.

В программе используется цикл с условием, поскольку есть две причины выхода из цикла: 1). когда f(x) = 0 или f(x)  ;

2). x1 - x2 < .

Задача. Найти корень уравнения на отрезке [1; 2] с точностью  =10-4 методом половинного деления.

Const a = 1;

b = 2;

eps = 1e-4;

var x1, x2, x, y1, y2: real;

f : boolean;

begin

x1 := a; x2 := b; f := true;

while f do

if abs (x1 - x2) > eps then

begin

y1 := cos(2/x1) - 2*sin(1/x1) + 1/x1;

x := (x1 + x2)/2;

y2 := cos(2/x) - 2*sin(1/x) + 1/x;

if abs(y2) > eps then

if y1*y2 > 0 then x1 := x

else x2 := x

else f := false

end

else f := false;

writeln (‘корень уравнения ’,x)

end.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]