Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


Пример 3.3 выполнения задания

Уточнение корней уравнений

Для численного решения алгебраических уравнений разработано множество итерационных методов (методов последовательного приближения к точному значению) уточнения корня. Задача ставится так: при заданном одном или двух (зависит от метода) начальных приближениях корня уравнения F(X)=0 получить приближение корня с заданной точностью ε.

Требуемая точность ε определяет условие завершения итерационного процесса, которое задаётся отношением |Xn-Xn-1| < ε, где Xn и Xn-1 – соседние приближения корня, полученные на (n-1) –м и n–м шагах его уточнения, а начальные (грубые) приближения корней можно найти, например, по результатам табулирования функции F(X).

Метод простых итераций

Для уточнения корня уравнения вида F(X)=0 его следует преобразовать к уравнению X=G(X). Исходными данными для уточнения корня являются требуемая точность ε и начальное приближение X0. Очередное приближение X1 корня вычисляется на основе текущего приближения X0 по формуле X1=G(X0) (на первом шаге уточнения корня Х0 представляет начальное приближение), после чего X0 получает значение X1 и процесс повторяется, пока модуль разности между Х0 и Х1 больше ε.

Применение метода приводит к решению, если |G'(Х)|<1 внутри интервала, содержащем корень уравнения.

Пример. Пусть известно, что при заданном начальном приближении корня X0 метод простых итераций обеспечит получение решения уравнения X=(X-0,1)4 +0,1. Тогда для нахождения корня с заданной точностью ε можно использовать следующий фрагмент программы.

 

uses

SysUtils, Math;

var

X0, X1, Eps, dX: Extended;

begin

ReadLn(X0,Eps);

repeat

X1:=IntPower(X0-0.1, 4)+0.1;

dX:=Abs(X0-X1);

X0:=X1

until dX<Eps;

WriteLn('С точностью ',Eps, ' корень равен ',X0);

............

end.

 

Метод не всегда обеспечивает нахождение корня. Так, при ε =10-3 и X0<1,1, где в окрестности корня 0,1 |G'(X)| = |4(X-0,1)3 |<1 будет найден этот корень (как будет проходить уточнение корня, показано стрелками на рис.3.1). Но в окрестности корня 1,1 (1,1 – второй корень уравнения), где |G'(X)| >1 каждый шаг процесса будет приводить к удалению от корня, что, в конечном счете, приведет к переполнению разрядной сетки машины и аварийному останову.

Чтобы найти корень уравнения X=G(X) при условии |G'(X)|>1, его следует преобразовать к виду X=H(X), где H(X) - обратная относительно G(X) функция, и использовать для поиска корня. С учетом сказанного, изменим текст фрагмента программы, чтобы была возможность находить все корни уравнения X=(X-0,1)4 +0,1, при любых начальных приближениях, когда |G'(X)|¹0.

 

uses

SysUtils, Math;

var

X0, X1, Eps, dX, P: Extended;

begin

ReadLn(X0,Eps);

P:=Abs(4*IntPower(X0-0.1,3));

if P=0 then

begin

WriteLn('Нарушено условие применимости метода!');

ReadLn;

Halt;

end

else if P<1 then

//Использование исходной функции

repeat

X1:=IntPower(X0-0.1, 4)+0.1;

dX:=Abs(X0-X1);

X0:=X1

until dX<Eps

else if P>1 then

//Использование обратной функции

repeat

X1:=Power(X0-0.1,0.25)+0.1;

dX:=Abs(X0-X1);

X0:=X1

until dX<Eps;

WriteLn('С точностью ',Eps, ' корень равен ',X0);

.......

end.

 

В некоторых случаях возможно зацикливание – бесконечное выполнение цикла программы (например, для уравнения X =1/X) или медленная сходимость процесса (например, для уравнения X = 1/(X-10-6).

Чтобы обеспечить информативность программ при зацикливании или очень медленной сходимости, в программах вводят ограничения на число итераций, и если за заданное число шагов заданная точность не достигается, то процесс останавливается и выдается соответствующее сообщение.

Пример. Составить фрагмент программы для решения следующей задачи. Найти корень уравнения X = 1/(X-10-6) с заданной точностью ε. Если за заданное число N шагов точность не будет достигнута, то прекратить выполнение программы и вывести с пояснениями модуль разности между двумя последними приближениями, значение ε и значение N, иначе вывести найденное значение корня и число шагов, за которое оно было найдено.

 

var

X0, X1, Eps:Extended;

I, N:Integer;

F:Boolean;

begin

ReadLn(X1,Eps,N);

F:=False;

for I:=1 to N do

begin

X0:=X1;

X1:=1/(X0-1E-6);

F:=Abs(X0-X1)<Eps;

if F then

//Решение найдено

break;//Выход из цикла

end;

if F then

WriteLn('Корень X0 = ',X0:12,' найден за ',i,' шагов')

else

WriteLn('Заданная точность ',Eps:0,' не достигнута за '

,N,' шагов');

.......

end.

 

Выполнив эту программу при X0=0,5, ε =10-3, N=5000000 можно убедиться, что после 5000000 итераций заданная точность достигнута не будет.

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

Исходными данными для уточнения корня уравнения вида F(X)=0 являются требуемая точность ε и два начальных приближения: XL и XR, между которыми должен находиться корень. Поэтому необходимым условием применения метода является истинность отношения F(XL)·F(XR)<0, то есть метод не пригоден в тех случаях, когда график F(X) лишь касается оси абсцисс, не пересекая её, например, в случае уравнения X2=0. Один шаг итерационного процесса уточнения корня состоит в перемещении правой (XR) или левой (XL) границы отрезка (XL,XR) в его середину в соответствии со следующим правилом: если знак F((XR+XL)/2) совпадает со знаком F(XL), то XL получит значение (XR+XL)/2, иначе это значение получит XR (см. рис. 3.2). Процесс повторяется, пока модуль разности между ХR и ХL больше ε.

Пример. Составить фрагмент программы уточнения корня уравнения arctg(X)-X=0 с заданной точностью ε при начальных приближениях корня ХL и ХR методом половинного деления.

 

ReadLn(XL,XR,Eps);

YL:=ArcTan(XL)-XL;

repeat

X:=(XL+XR)/2;

Y:= ArcTan(X)-X;

if Y*YL>0 then

XL:=X

else

XR:=X;

until Abs(XR-XL)<Eps;

WriteLn('Корень уравнения равен ', X:12);

Метод касательных

Исходными данными для уточнения корня уравнения вида F(X)=0 являются требуемая точность ε и начальное приближение X0. Необходимым условием применения метода является истинность отношения F(X0)·F''(X0)>0. Один шаг итерационного процесса уточнения корня состоит в вычислении очередного приближения по формуле X1= X0-F(X0)/F'(X0), после чего X0 получает значение X1 (см. рис. 3.3). Процесс повторяется, пока модуль разности между Х0 и Х1 больше ε.

Пример. Составить фрагмент программы уточнения корня уравнения
(X-0,1)4 –X + 0,1=0
с заданной точностью ε при начальном приближении корня Х0.

 

ReadLn(X0, Eps);

repeat

dX:=(IntPower(X0-0.1, 4)-X0+0.1)/(4*IntPower(X0-0.1, 3)-1);

X1:=X0-dX;

X0:=X1

until Abs(dX)<Eps;

WriteLn('Корень уравнения равен ', X0:12);

 

В этом фрагменте использовалась найденное заранее выражение 4(X-0,1)3 –1 первой производной для (X-0,1)4 –X + 0,1. С точки зрения объема и точности вычислений такое решение предпочтительнее использования для этих целей разностного отношения, как, например, в следующем операторе

 

dX1:=(IntPower(X0-0.1, 4) - X0+0.1)

/(((IntPower(X0+1e-8-0.1, 4) - X0+1e-8+0.1)

-(IntPower(X0-0.1,4) - X0+0.1))/1e-8);

 

где для вычисления приближенного хначения производной использовалась формула и ΔX=10-8.

Пример 3.3 выполнения задания

Программа составлена по условию варианта задания №30 (см. ниже). В реализации метода касательных используются выражения производной 9Х2-10Х+1 и второй производной 18Х-10 выражения, входящего в уравнение 3Х3-5Х2+Х+0,4=0.

 

program Project1;

{$APPTYPE CONSOLE}

uses

SysUtils, Math;

var

X0,X1,Eps,dX,X,XL,XR,YL,Y:Extended;

i,N:Integer;

begin

//Метод касательных

WriteLn('Метод касательных');

Write('Введите X0, Eps и N: ');

ReadLn(X0,Eps,N);

//Проверка применимости метода

if (3*IntPower(X0,3)-5*Sqr(X0)+X0+0.4)*(18*X0-10) <= 0 then

WriteLn('Не выполнено условие применимости'

,' метода касательных!')

else

begin

i:=0;

repeat

i:=i+1;

dX:= (3*IntPower(X0,3)-5*Sqr(X0)+X0+0.4)

/(9* Sqr(X0)-10*X0+1);

X1:=X0-dX;

X0:=X1

until (Abs(dX)<Eps) or (i=N);

if Abs(dX)<Eps then

WriteLn('Корень Х уравнения ',X0:14,' найден за ',i

,' шагов, Y(X) = '

,3* IntPower(X0,3)-5* Sqr(X0)+X0+0.4:14)

else

WriteLn('Корень уравнения не найден!');

end;

WriteLn;

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

WriteLn('Метод половинного деления');

Write('Введите XL, XR, Eps и N: ');

ReadLn(XL, XR, Eps, N);

//Проверка применимости метода

if (3*IntPower(XL,3)-5*Sqr(XL)+XL+0.4)

*(3*IntPower(XR,3)-5*Sqr(XR)+XR+0.4) > 0 then

WriteLn('Не выполнено условие применимости'

,' метода половинного деления!')

else

begin

YL:=3*IntPower(XL,3)-5*Sqr(XL)+XL+0.4;

i:=0;

repeat

X:=(XL+XR)/2;

Y:= 3*IntPower(X,3)-5*Sqr(X)+X+0.4;

if Y*YL>0 then

XL:=X

else

XR:=X;

inc(i);

until (Abs(XR-XL)<Eps) or (i=N);

if Abs(XR-XL)<Eps then

WriteLn('Корень уравнения ',X:14,' найден за '

,i,' шагов, Y(X) = ',Y:14)

else

WriteLn('Корень уравнения не найден');

end;

ReadLn;

end.



<== предыдущая лекция | следующая лекция ==>
Вставка и настройка графических заголовков | Катя Луканина, Без названия
Поделиться с друзьями:


Дата добавления: 2016-11-22; Мы поможем в написании ваших работ!; просмотров: 439 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Своим успехом я обязана тому, что никогда не оправдывалась и не принимала оправданий от других. © Флоренс Найтингейл
==> читать все изречения...

2378 - | 2186 -


© 2015-2024 lektsii.org - Контакты - Последнее добавление

Ген: 0.013 с.