Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Паскаль.doc
Скачиваний:
58
Добавлен:
07.06.2015
Размер:
1.21 Mб
Скачать

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

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

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

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

Обычно для вычисляемой величины Y задается некоторое начальное значение (приближение) Yo и погрешность вычисления результата (Y) в виде: E=(0,5; 1)*10-m, где m – целое число. Как правило, E=(0,1; 0,5, 0,01; 0,05, 0,001 и т.д.). Считается, что заданная точность достигнута, если найденные значения Yпред и Yслед отличаются на величину, меньшую E, т.е. условие окончания вычислений можно записать так:

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

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

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

Пример 1. Вычислить значение функции SinX по приближенной формуле

F = SinX = X - X3/3! + X5/5! - ...+(–1)2n-1 X2n-1/(2n-1)!, n=1, 2, 3 ...

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

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

F = U1 + U2 + ... + Un

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

|F - Fслед|< E

Заметим, что |F-Fслед| = |Uслед| – очередное слагаемое. Можно сказать, что вычисления прекращают, как только получают член ряда, меньший, чем заданная абсолютная погрешность.

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

Пусть речь идет о слагаемом с номером n. Тогда на основании общей формулы для члена ряда это слагаемое (предыдущее) без учета знака запишется так:

.

Номер следующего слагаемого будет n+1, тогда само слагаемое запишется так:

.

Разделив последнее выражение на предыдущее, получим выражение для вычисления следующего члена ряда по известному предыдущему

.

Обратите внимание, что в этой формуле n означает номер предыдущего члена. Если считать, что n имеет начальное значение 1 и изменяется с шагом 2, то знаменатель Uслед может быть вычислен как произведение вида:

(n + 1) (n+2).

Заметим еще, что при программировании подобных задач часто вводят одну переменную для представления как предыдущего слагаемого, так и последующего.

Вначале: n=1; U=X; F=0 {U – играет роль предыдущего и следующего члена}

Алгоритм

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

2. Положить n=1, U = X, F=0.

3. Пока |U|>E

Вычислить F=F+U;

Вычислить очередной член U = –U X2/((n + 1) (n+2));

Получить его номер n=n+2.

4. Вывести X и F.

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

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

Program NovSin;

Var

F, X, E, U : Real;

n : Integer;

Begin

Writeln('Введите аргумент Х и погрешность Е');

Readln(X,E);

n := 1;

U :=X ;

F:=0;

While Abs(U)>E Do

Begin

F:=F+U;

U:=-U*Sqr(X)/(2*N*(2*N+1));

N:=N+1;

End;

Writeln(X:8:6,' SinX=',F:10:6,

' Машинный SinX=',Sin(X):10:6);

End.

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

k := 0;

while abs(U)>E do

begin

k := k+1;

F :=.......;

. . . . . .

end;

writeln('k= ',k);