Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
_МЕТ№1.DOC
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
180.74 Кб
Скачать

Итерационные циклы

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

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

Yслед=f(Yпред)

Обычно задается начальное значение (приближение)

Yo

и погрешность вычисления результата (Y) в виде: E= 10-m – с каким количеством цифр после запятой необходимо определить Y. Считается, что заданная точность достигнута, если найденные значения Yпред и Yслед отличаются на величину, меньшую E, т.е. условие окончания вычислений:

|Yслед - Yпред|<E

Для программирования итерационных циклов в Паскале используются операторы WHILE и REPEAT.

Типовые алгоритмы с итерационными циклами

1. Приближенное вычисление функций

Пример 1.

Вычислить значение функции Sin x по приближенной формуле

F = Sin X = X - X3/3! + X5/5! - ...

с погрешностью E=10-5.

Функция F здесь представляет собой сумму членов степенного ряда:

F = U1 + U2 + ... + Un

Условие окончания вычисления функции:

|F - Fслед|< E

Заметим, что |F-Fслед| = |Uслед| – очередное слагаемое.

Запишем формулу для его вычисления, учитывая, что в выражении для Sin присутствуют только нечетные степени x и факториалы нечетных чисел:

Очередное слагаемое:

Следующее слагаемое:

Слагаемые можно определить:

1) непосредственно по формуле;

2) используя предыдущее значение:

Вначале: n=1; U1=X ; U3=-X2/(2*3)*U1; f0=0; f1=f0+U1=X

Алгоритм

1. Ввести X и Е.

2. Положить Uпредыд=X ;Uслед=-X3/(2*3); n=1

3. f=0

4. Пока |Un|>E

вычислить f=f+Uпредыд

Uслед=-Uпредыд*X3/(n+1)(n+2)

Увеличить n=n+2

Заменить Uпредыд=Uслед

5. Вывести f и Uпредыд

6. Закончить.

Введем следующие обозначения:

x => X

E => E

f => F

Uпредыд. => U

Uслед. => UN

Программа для рассмотренного алгоритма будет иметь вид:

PROGRAM NOVSIN;

VAR

F,x,e,u,un:real;

n:integer;

begin

Writeln('Введите х и Е');

read(x,e);

u:=x;

un:=-u*x*x/(2*3);

f:=0;

n:=1;

while abs(un)>e do

begin

f:=f+u;

un:=-u*sqr(x)/((n+1)*(n+2));

n:=n+2;

u:=un;

end;

writeln('sin',x,'=',f,'погрешность',u);

end.

Количество повторений цикла заранее неизвестно. Оно зависит от требуемой точности и от значения аргумента. Если X=0, то цикл не выполняется ни разу. Количество повторений цикла можно подсчитать с помощью обычного счетчика:

k:=0;

while abs(un)>e do

begin

k:=k+1;

f:=.......;

end;

writeln('k= ',k);

2. Решение уравнений приближенными методами

В общем виде уравнение может быть записано так:

f(x)=0,

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

2.1. Метод Ньютона

Этот метод еще называют методом касательных. Он заключается в следующем.

1. Выбирается интервал [a,b] значений аргумента Х, на котором ищется корень. На этом интервале функция должна менять знак.

2. Начальное значение корня X0 принимается равным левой (a) или правой (b) границе интервала.

3. Вычисляется очередное приближение по формуле

Хслед = Хпред - f(Хпред)/f'(Хпред)

4. Если |Хслед - Хпред|<E, то Хслед - корень, в противном случае – выполняется подстановка Хслед на место Хпред и повторение п.3.

Очевидно, что метод позволяет определить корень, если:

1) f(x) дифференцируема;

2) f'(x) не равна 0 в Е-окрестности корня.

Неудачный выбор Х0 может привести к тому, что приближения "расходятся" от точки корня.

Рассмотрим пример программы нахождения корней уравнения.

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

2Cosx - exp(-x)=0,

т.е. f(x)=2Cosx - Exp(-x) и

f'(x)=2Sinx - Exp(-x)

Обозначим:

Хo => X0 E => E

Хстарое => X

Хновое => Xn

Программа будет иметь вид:

Program NUTON;

Var

y,x0,x,xn,e:Real;

Begin

Writeln('Введите x0,Е');

Readln(Х0,e);

x:=Х0;

y:=10*e; {начальное значение разности приближений}

While ABS(y) > Е do

Begin

xn:=x-(2*SIN(x)-EXP(-x))/(2*COS(x)+EXP(-x));

y:=xn-x;

x:=xn;

End;

Writeln('Корень = ',xn:8:4,' разность = ',y:8:6);

Readln;

End.

Можно определить количество приближений (итераций) - количество повторений цикла.

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