Решение нелинейных уравнений

Если алгебраическое или трансцендентное уравнение достаточно сложно, то его сравнительно редко удается решить аналитическими методами. Более того, в некоторых случаях коэффициенты уравнения известны лишь приближенно, и сама задача о точном определении корней теряет смысл. Поэтому важное значение приобретают способы приближенного нахождения корней уравнения и оценки их точности. Пусть дано уравнение:

,

где функция f(x) определена и непрерывна в некотором конечном или бесконечном интервале . Всякое значение ξ, обращающее функцию f(x) в нуль, т.е. такое, что f(ξ) = 0, называется корнем уравнения. Будем предполагать, что уравнение имеет лишь изолированные корни, т.е. для каждого из них существует окрестность D, не содержащая другие корни (рис. 26). Решить уравнение численными методами – это значит определить, имеет ли оно корни, сколько их и найти корни с заранее заданной точностью. Для решения уравнений вида разработано много различных итерационных методов. Сущность этих методов заключается в следующем.

Рисунок 26 – Решение уравнения

Пусть известна достаточно малая область D, в которой содержится единственный корень ξ уравнения. В этой области выбирается точка x0 – начальное приближение – и строится последовательность точек x1,x2,…xn,…, сходящаяся к ξ, с помощью некоторого рекуррентного соотношения:

.

Рекуррентное вычисление повторяется до тех пор, пока абсолютное значение разницы между двумя последовательными значениями х не станет меньше некоторого значения е, называемого точностью:

.

Выбирая различными способами функции φk, которые зависят от функции f и номера k, можно получить различные методы.

Численное решение нелинейных уравнений
методом итерации

Заменим уравнение

равносильным ему уравнением

.

И исходное и полученное уравнения имеют одинаковый корень x (рис. 27) и называются эквивалентными.

Вы­бе­­­рем любым спо­со­бом х0, которое затем под­­­­ста­­вим в левую часть урав­­­не­ния:

.

По­лу­чен­ное значение х1 снова под­­ста­вим в ле­вую часть и получим:

.

Про­дол­жая этот про­цесс, получим по­сле­до­ва­тель­ность чи­­сел х1, х2,..., xn, ко­торая мо­жет либо схо­дить­ся, т.е. иметь предел, ли­бо рас­хо­дить­ся, т.е. не иметь предела. Тогда в со­­ответствии с по­лу­чен­ным результатом в первом слу­чае этот предел является кор­­нем урав­­нения (х ® x), во втором случае сде­лаем вы­­вод о не­воз­можности по­лу­чения ре­ше­ния дан­ным спо­со­бом.

Рисунок 27 – Геометрическая интерпретация итерационного метода решения уравнения

Алгоритм реализации данного метода будет схож с алгоритмом рекуррентного вычисления бесконечной суммы.

Приведём программу, реализующую итерационный метод уточнения корня уравнения:

.

program Iter;

VAR

xp, e, x0, x:REAL;

Function f(x:real): real;

Begin

f:= x*x-2;

end;

Begin

writeln('введите начальное приближение х и точность');

read(x0,e);

x:=x0;

REPEAT

xp:=x;

x:=f(x);

UNTIL ABS(x-xp)<e;

writeln('корень уравнения =', x);

End.

В данной программе используется подпрограмма функция f, которая вычисляет левую часть преобразованного уравнения:

.

Переменная xp используется в программе для сохранения предыдущего значения х.

Численное решение нелинейных уравнений
методом бисекции

Метод сос­то­ит в по­стро­е­нии по­­­сле­­до­ва­тель­ности вло­жен­ных от­рез­ков, на кон­­цах ко­то­рых F(х) имеет разные зна­ки. Каж­дый по­­­сле­­ду­ю­щий от­ре­зок получают де­ле­ни­­ем по­по­лам пре­ды­ду­­ще­го. Этот процесс по­стро­е­ния по­­­сле­­до­­ва­тель­нос­ти вло­жен­ных отрезков по­зво­ляет най­­­ти нуль функ­ции (F(х) = 0) с лю­бой за­дан­ной точ­­­ностью.

Опишем подробно один шаг итерации (рис. 28). Пусть на k-м ша­ге найден отрезок [аk, bk], на концах ко­­то­рого F(х) меняет знак. Заметим, что обязательно [аk, bk] Î [а, b].

1. Разделим те­перь отрезок [аk, bk] пополам и вы­де­­лим F(ck), где ck – се­ре­ди­­на [аk, bk].

2. Здесь воз­мож­­ны два слу­чая:

§ первый, ког­да F(ck) = 0, тогда мы го­ворим, что ко­рень найден;

§ вто­рой, ког­да F(ck) ¹ 0, тог­да срав­­ниваем знак F(ck) с F(аk) и F(bk) и из двух по­­ло­­вин [аk, ck] и [ck, bk] вы­бираем ту, на концах ко­то­рой функ­ция меняет свой знак. Та­ким образом, аk+1 = аk, bk+1 = ck, если F(ck)F(аk) < 0 (рис. 27), и аk+1 = ck, bk+1 = bk, ес­ли F(ck)F(bk) < 0.

При заданной точности e деление пополам про­­­­­­дол­жа­ют до тех пор, пока длина отрезка не ста­­­­­нет меньше 2e, тогда координата середины по­­след­­­­него най­­­денного от­резка и есть значение кор­­ня тре­бу­е­мой точ­ности.

Рисунок 28 – Геометрическая интерпретация решения уравнения методом бисекции
a) k–й шаг; b) k+1-й шаг.

Приведём программу, реализующую итерационный метод уточнения корня уравнения:

.

program Bisect;

VAR

A,B,E:REAL; X: REAL;

Function f(x:real): real;

Begin

f:= x*x-x-2;

end;

Begin

writeln('введите отрезок локализации корня [a,b] и точность');

read(a,b,e);

k:=0;

REPEAT

X:= (A+B)*0.5;

IF f(X)*f(B)<0 THEN

a:=x

Else

b:=x

UNTIL ABS(B-A)<e;

writeln('корень уравнения =', (A+B)*0.5);

END.

В данной программе используется подпрограмма функция f, которая вычисляет левую часть исходного уравнения:

.

Переменная x используется в программе для сохранения значения середины отрезка [a, b].

Численное решение нелинейных уравнений
методом Ньютона

Положим:

,

где x – корень уравнения f(x) = 0, hn считаем малой величиной. Отсюда, применяя формулу Тейлора, получим:

.

Следовательно, . Подставив это выражение, получим:

Геометрическая интерпретация метода представлена на рисунке 29.

Через точку А0(х,у) с координатами х = x0, у = f(x0) про­водим ка­са­тель­­ную. По формуле

на­ходим точку пересечения касательной с осью ОХ (точ­к­а х1).

Находим точку А11,у), проводим касательную через точку А1 для нахождения х2.

Этот процесс продолжаем до тех пор, пока разница |хi+1-xi| не станет меньше, чем значение e, т.е. пока не будет найдено значение корня с заданной точностью e.

Рисунок 29 – Геометрическая интерпретация решения уравнения методом Ньютона

Приведём программу, реализующую итерационный метод уточнения корня уравнения:

.

program Newton;

VAR xp,E,x0:REAL; X: REAL;

Function f(x:real): real;

Begin

f:= x*x-x-2;

end;

Function df(x:real): real;

Begin

df:= 2*x-1;

end;

Begin

writeln('введите начальное приближение х и точность');

read(x0,e);

x:=x0;

REPEAT

xp:=x;

x:=x-f(x)/df(x);

UNTIL ABS(x-xp)<E;

writeln('корень уравнения =', x);

END.

В данной программе используется подпрограмма функция f, которая вычисляет левую часть исходного уравнения:

а также подпрограмма функция df, которая вычисляет значение дифференциала:

.

Переменная xp используется в программе для сохранения предыдущего значения х.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: