Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
П р о г р а м м и р о в а н и е и т е р а ц и о н н ы Х ц и к л о в
Итерационным называется такой вычислительный процесс, для которого заранее неизвестно количество выполнений цикла; это количество зависит от конкретных значений исходных данных. Критерием окончания циклического процесса является выполнение некоторого заранее заданного условия. Алгоритмы и программы, приведенные в разделах, где рассматриваются циклы while и do-while, являются примерами итерационных циклов. Частным случаем итерационного вычислительного процесса является так называемый метод последовательных приближений, в котором для определения очередного, более точного значения функции используется ее предыдущее значение. Как правило, признаком окончания вычислений является достижение заданной точности:
где
Пример 1. Итерационная формула Ньютона для функции
где
Рассмотрим действие формулы Ньютона для
Условие
а) б)
В блок-схеме варианта а) нельзя применить оператор цикла с предусловием, так как в операторе while проверка условия выполнения цикла должна производиться в самом начале цикла. В связи с этим внесены изменения в схему реализации итерационной формулы Ньютона (вариант б)).
В программе вместо исходных переменных
int main() { float const eps = 0.00001; float x, y, yn; //Ввод и печать x y=x; yn=x+2*eps; if (x> 0) while (fabs(y-yn)> eps) { yn=y; y=0.5*(yn+x/yn); } //Печать y getch(); return 0; }
Примечания. 1.Функция fabs() возвращает модуль выражения типа float. Для использования этой функции подключается заголовочный файл " math.h ". 2.Оператор " if (x> 0)" в программе исключает прерывание программы из-за деления на нуль при x = 0 (если x = 0, то при первом выполнении цикла yn = y = 0). 3.Оператор " yn=x+2*eps; " в программе введен исключительно для задания значения переменной yn, которая используется в проверке условия входа в цикл. От него можно избавиться, если использовать цикл do-while. Ниже приведена реализация этого алгоритма с циклом do-while.
int main() { float const eps = 0.01; float x, y, yn; //Ввод и печать x x=16; y=x; if (x> 0) do { yn=y; y=0.5*(yn+x/yn); } while (fabs(y-yn)> eps); //Печать y getch(); return 0; }
Пример 2. Вычисление функции по ее разложению в ряд. В Си, как и в других языках программирования высокого уровня, определены стандартные функции sin(x), cos(x) и др. Вполне очевидно, что вычисление этих функций производится по некоторым формулам, а не по таблицам значений. Одним из методов вычисления функций является разложение их в ряд, в частности, в так называемый ряд Маклорена (существуют и другие ряды, например, ряд Лорана, ряд Фурье, разложение по полиномам Чебышева и пр.). Программная реализация таких рядов сводится к организации итерационных циклов.
Рассмотрим методику вычисления по формулам разложения в ряд на примере функции
Как известно, n! = 1 × 2 × 3 ×... × n. Например, 5! = 1 × 2 × 3 × 4 × 5 = 120. В частности, считают 1! = 1; 0! = 1.
Тогда
Является очевидным, что при малых значениях аргумента Пусть
- 0.0000015500993+...
При Как видно из примера, элементы разложения функции
Обозначим члены ряда через
Частная сумма, определяющая с некоторой погрешностью значение искомой функции
…………………………..
Условие окончания вычислений (окончания итерационного цикла):
или, используя (3),
Каждый очередной член ряда (1) можно вычислять непосредственно по формуле (2), задав соответствующее значение Например, при вычислении
для вычисления
Однако при вычислении
Выведем формулу для общего случая вычисления Из формулы (2), подставив вместо
Тогда
Формула типа (4), в которой для вычисления очередного члена Для вычисления ряда (1) имеем следующие рабочие формулы:
Блок-схема вычислений:
Значение целочисленной переменной
Си-программа. int main() { float const eps = 0.00001; float x, a, S, n; //Ввод и печать x x=0.5; a=x; S=x; n=0.; while (fabs(a)> eps) { a=-pow(x, 2)*a/((2*n+2)*(2*n+3)); S+=a; n+=1; } //Печать S getch(); return 0; }
|