Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Informatika_Lektsia_6.doc
Скачиваний:
3
Добавлен:
01.03.2025
Размер:
349.7 Кб
Скачать

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

Как отмечено выше, в итерационном цикле количество итераций зависит от выполнения условия, заданного в нем, и в общем случае это количество может быть любым – от 0 до бесконечности.

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

Основная идея численного итерационного метода решения заключается в том, что:

а) вначале задается некоторое начальное приближенное значение x0,

б) затем по специальной формуле, которую называют расчетной схемой метода, рассчитывается итерационная расчетная последовательность xn= xn(xn-1) при n=1,2,…,

в) процесс завершается, когда будет выполнено условие завершения расчетов, которое чаще всего принимают в виде: xn - xn-1≤ , где  - наперед заданное малое положительное число.

Итерационные циклы в зависимости от относительного положения в операторе проверяемого условия и тела цикла имеет две разновидности:

1) с предусловием - условие проверяется перед телом цикла,

2) с постусловием - условие проверяется после выполнения тела цикла.

Синтаксис итерационного цикла с предусловием имеет вид:

while выражение do оператор

Тело цикла составляет Оператор , стоящий после do. Он выполняется до тех пор, пока логическое выражение принимает истинное значение (True). Как только логическое выражение принимает значение ложь (False), осуществляется переход к оператору, следующему за оператором цикла while.

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

Если после do необходимо выполнить группу операторов, то тело цикла необходимо оформить в виде составного оператора. Блок-схема итерационного цикла с предусловием дана на рис.6.3.

Примеры 1 применения итерационных циклов с предусловием.

1) x:=1.0Е-10;while x<0.01 do x:=2*x+exp(x);{расчет возрастающих значений переменной x}

2) x:=2;delta_x:=1;{численное итерационное решение уравнения х=sin(x)+1 в окрестности x=2}

while delta_x<1Е-3 do begin x_pr:=x; x:=sin(x)+1; delta_x:= abs(x-x_pr) end;

Рис.6.3. Итерационный цикл с предусловием Рис.6.4. Итерационный цикл с постусловием

Синтаксис оператора итерационного цикла с постусловием имеет вид:

repeat

оператор 1;

оператор 2;

...

oператор n

until выражение

Группа операторов между словами repeat и until, составляющая тело цикла, повторяется до тех пор, пока логическое выражение, стоящее после служебного слова until, является ложным (False). Как только оно становится истинным (True), происходит выход из цикла. Так как выражение оценивается каждый раз после выполнения операторов, то в любом случае операторы выполнятся хотя бы один раз при входе в цикл. Блок-схема итерационного цикла с постусловием дана на рис.6.4.

Пример 2 применения итерационного цикла с постусловием для расчета суммы S первых членов гармонического ряда, удовлетворяющих условию 1/i ≤ 0,001:

S:=0;i:=0;

repeat

i:=i+1;

S:=S+1/i;

until 1/i>1E-3;

S:=S-1/i;

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

Пример 3. Написать программу вычисления с заданной точностью  приближенного значения квадратного корня из вещественного числа х по методу Ньютона, в котором используется сходящаяся к искомому корню итерационная расчетная последовательность {xn, n=0,1,…}, образующаяся по следующей расчетной схеме:

x0=x; (n=0);

xn= xn(xn-1) = 0,5(xn-1 + x/xn-1); (n≥1).

Условие завершения итерационного процесса: xn - xn-1≤ .

Для каждой расчетной итерации выдать на экран: ее номер, текущее значение корня xn и модуль разности xn - xn-1. В конце расчетов выдать на экран результирующие значения этих же величин.

Решение. Задача представляет собой типичный пример итерационных расчетов, завершение которых при заданной расчетной схеме и начальных данных зависит только от выполнения условия окончания итерационного процесса. Обозначим в программе текущее значение xn искомого корня числа x через sqx. Поскольку текущее значение xn рассчитывается по предыдущему xn-1, то наряду с sqx введем обозначение sqx_pr для предыдущего значения искомого корня. Модуль разности xn - xn-1 обозначим через delta. Число выполненных расчетных итераций обозначим через n.

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

Программа с подробными комментариями:

program SQRT_Newton;

uses Crt; {подключение библиотеки CRT для работы с экраном}

var x,eps,sqx,sqx_pr,delta:real; {описание вещественных переменных программы}

n:integer; {описание целочисленных переменных программы}

begin {начало раздела операторов}

ClrScr; { очистка экрана }

Write('vvedite chislo x:');{вывод запроса на ввод числа х}

ReadLn(x); {ввод числа х}

Write('vvedite tochnost rascheta kornia:');{вывод запроса на ввод точности расчета }

ReadLn(eps);{ввод точности расчета }

n:=0; {задание начального значения числа итераций}

sqx:=x; {задание начального значения аргумента x0=x; (n=0) }

repeat

n:=n+1; {расчет n номера очередной итерации}

sqx_pr:=sqx; {присвоение xn:= xn-1}

sqx:=0.5*(sqx_pr+x/sqx_pr); {расчет xn= xn(xn-1) }

delta:=abs(sqx_pr-sqx); {расчет модуля разности xn - xn-1}

WriteLn('It.number=',n,’ sqx=’,sqx,’ delta=’,delta){вывод расчетных величин}

until delta<eps; {условие окончания цикла}

WriteLn('REZULT: n=',n,’ sqx=’,sqx,’ delta=’,delta) {вывод результатов расчета}

end. {конец раздела операторов и всей программы}

Вопросы для проверки знаний.

1. Какие циклы называют итерационными ?

2. При решении каких математических задач применяют алгоритмы на основе итерационных циклов ?

3. В чем заключается идея итерационного численного метода решения нелинейных уравнений ?

4. Чем отличаются итерационные циклы с предусловием от циклов с постусловием ? Какой из этих циклов выполняется всегда хотя бы один раз ?

5. В теле какого из итерационных циклов для выполнения группы операторов обязательно использование составного оператора ?

6. У какого из итерационных циклов тело выполняется при условии истинности выражения цикла, а у какого - при условии ложности выражения цикла ?

Практическое задание.

1. Написать операторы, решающие задание из п.6.1 при помощи итерационного цикла с предусловием.

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