01 (537404), страница 7
Текст из файла (страница 7)
Y = Cos(X*X)
Write(*, 2) X, Y
2 Format(' X=', F4.1, ' Y=', F7.4)
1 X = X + 0.1
End
Цикл Do_While часто используется для выполнения пересчетов (итераций) по одним и тем же формулам. Например, при решении уравнения x3 - 3x2 - 60x - 198 = 0 он позволяет выделить отрезок, где существует его корень, удовлетворяющий условию x > 0. На этом отрезке функция y(x) = x3 - 3x2 - 60x - 198 меняет свой знак с "-" на "+". Для решения этой задачи может быть предложен следующий алгоритм.
Сначала аргумент x принимает значение 0. Для него вычисляется значение функции y(x), которое сравнивается с нулем. Если y(x) меньше нуля, то значение аргумента увеличивается на шаг (0,1), в противном случае текущее значение аргумента x принимается за правую границу искомого отрезка. Левая граница отрезка вычисляется как x - 0,1. Данный алгоритм может быть реализован в виде программы:
123456789..............................................................72 73......80
X = 0.
Do While (X*X*X - 3*X*X - 60*X - 198.LT.0.)
X = X + 0.1
EndDo
Write(*, *) X - 0.1, ' < X <', X
End
В отличие от рассмотренной выше задачи о расчете значений функции одной переменной построение таблиц функций двух переменных требует использования вложенных циклов. Так для вычисления значения функции y = x(n - x)2 для аргументов x = 0; 0,1; ...1,0 и n = 5; 4; 3; 2 блок-схема алгоритма и программа будут иметь вид:
C *** Лабораторная работа № 4***
Open(1, File = 'prog_4.res', Err = 3)
C *** Внешний цикл по N ***
Do N = 5, 2, -1
Write(1, 2) N
C *** Внутренний цикл по X ***
Do X = 0., 1.05, 0.1
Y = X*(N - X)**2
Write(1, 1) X, Y
EndDo
C *** Конец внутреннего цикла ***
EndDo
C *** Конец внешнего цикла
1 Format(' X=', F3.1, ' Y=', F8.5)
2 Format(' N=', I1)
Close(1)
Stop
C *** Аварийная печать ***
3 Write(6, 4)
4 Format(' Не могу создать файл ‘ )
End
З а д а н и е к л а б о р а т о р н о й р а б о т е
Составить программу для расчета значений функций в указанном диапазоне изменения аргумента и параметра. Результаты вычислений поместить в файл prog_4.res. По результатам расчета функций на указанном отрезке с заданными шагом и диапазоном изменения параметра построить их графики.
1. | 2. | ||
3. | 4. | ||
5. | 6. | ||
7. | 8. | ||
9. | 10. | ||
11. | 12. | ||
13. | 14. | ||
15. | 16. | ||
17. | 18. | ||
19. | 20. | ||
21. | 22. | ||
23. | 24. | ||
25. | 26. | ||
27. | 28. | ||
29. | 30. |
Л А Б О Р А Т О Р Н А Я Р А Б О Т А № 5
ВЫЧИСЛЕНИЕ РЯДОВ И БЕСКОНЕЧНЫХ ПРОИЗВЕДЕНИЙ
С п р а в о ч н а я и н ф о р м а ц и я
Когда при решении технической задачи возникает необходимость вычислить значения функции при заданном значении аргумента, то даже для достаточно простых функций это порождает затруднения.
В самом деле, такие ответы для технической задачи, как
неудовлетворительны, так как необходимо знать вполне определенные числа. Действительно, что будет делать токарь, которому указано выточить вал диаметром ln 147 мм ? Поэтому, когда требуется с наперед заданной точностью представить числом значение функции при некотором заданном значении аргумента, используют теорию рядов, куда входят как собственно ряды, так и бесконечные произведения, цепные дроби и пр.
Например, элементарные тригонометрические функции могут быть представлены в виде степенного ряда:
бесконечного произведения:
цепной дроби
Для вычисления ряда функций в Фортране предусмотрена библиотека, содержащая описание достаточно узкого круга элементарных функций. Этого явно недостаточно для практического применения, поэтому часто приходится самостоятельно программировать вычисление функций.
В основе таких расчетов лежит процесс накопления численной информации в виде сумм или произведений его членов. Накопление может осуществляться либо по заданному числу членов ряда, либо по заданной погрешности вычислений. Последний способ применим только для сходящихся рядов и решается с точки зрения теории рядов не совсем строго. Вычисляют члены ряда один за другим и, если модули их величин выходят за пределы принятой погрешности, причем нет основания ожидать, что последующие члены дадут существенный вклад, то все дальнейшие члены ряда отбрасывают. Аналогично поступают при вычислении бесконечного произведения, где это условие трактуется как степень приближения модуля очередного сомножителя к единице.
Алгоритм накопления организуется в цикле таким образом, чтобы при каждом новом выполнении его тела к вычисляемой величине добавлялся очередной член. Таким образом, вычисления будут производиться по следующим формулам:
для ряда – Sn+1 = Sn + an+1 ;
для произведения – Sn+1 = Sn. an+1 .
Например, для рассмотренных функций приведенные формулы будут иметь вид:
Если предположить, что величина Sn, в которой накоплены значения первых n элементов, хранится в некоторой переменной с именем S, то получение очередного значения Sn+1 требует наличия в теле цикла одного из следующих операторов:
S = S + A
S = S*A ,
где A – имя переменной, содержащей значение an+1.
В зависимости от способа накопления Sn, начальное значение переменной S устанавливается по-разному. Для случая суммирования ряда оно устанавливается из следующих предпосылок: равным нулю, если первый член ряда подпадает под общую закономерность способа вычисления членов ряда, или равным a1 в противном случае. Для бесконечного произведения – единица или a1 по тому же правилу. Например, для приведенных выше функций надо установить следующие начальные значения S:
для cos x – S = 1 и суммирование производить с n = 1;
для sin x – S = X и накапливать произведение с n = 1;
Центральным звеном циклического алгоритма накопления является форма вычисления очередного члена. В практике программирования используются три основных приема:
-
очередной член формируется по общей формуле и вычисляется отдельным оператором или непосредственно при накоплении;
-
очередной член вычисляется по рекуррентной формуле, в которой последующее значение получается на основе предыдущего. При этом предыдущий член входит в очередной как сомножитель. Вычисления производятся в отдельном операторе;
-
очередной член носит составной характер и его целесообразно рассматривать в виде произведения двух частей. Одна часть вычисляется по рекуррентной формуле отдельным оператором, а другая - добавляется как сомножитель при его окончательном формировании.
Эти приемы иллюстрируются следующими примерами.
Пример 1. Вычислить сумму
Алгоритм накопления организуется по циклической схеме Sn+1 = Sn + an+1, причем в качестве переменной цикла следует использовать номер члена суммы n = 1, 2, ..., 100. Тогда начальное значение переменной, в которой будет накапливаться сумма, следует установить равным нулю, а очередной член суммы формировать по общей формуле. Алгоритм предлагаемых вычислений может быть представлен блок-схемой на рис.1.
Рис.1.
Для того, чтобы убедиться в работоспособности разрабатываемого алгоритма, рекомендуется проследить процесс вычис-