
- •Lesson 3 Приближенные вычисления
- •Ряд Тейлора
- •Точность вычислений
- •Рекуррентная формула
- •Блок-схема алгоритма
- •Текст программы
- •Отладка программы
- •Альтернативная блок-схема
- •Bвод и вывод данных
- •Операторы open и close
- •Оператор read – ввод данных
- •Оператор write – вывод данных
- •Оператор format
- •Спецификации числовых данных
- •I -спецификация формата.
- •F -спецификация формата
- •E, d -спецификации формата
- •G-спецификация формата
- •Вывод комплексных чисел
- •Спецификации нечисловых данных a-спецификация формата
- •L-спецификация формата
- •X-спецификация формата
- •Cпецификация формата – «слэш»
- •Взаимодействие операторов write и format .
- •Оператор nameList
Рекуррентная формула
При суммировании ряда необходимо решить следующие задачи:
свести вычисления к простейшим арифметическим операциям;
уменьшить число этих операций и время расчета;
уменьшить погрешность округления.
Рассмотрим вычисление функции sin x. Разложение этой функции в ряд Тейлора имеет следующий вид
.
Область
сходимости ряда определяется неравенством
,то есть ряд сходится
при любом значении x.
Величина n! называется “n-факториал” и вычисляется по формуле:
n! = 1×2×3×…×(n– 1)×n= (n– 1)!×nили
Принято считать, что 0! = 1.
Суммирование ряда последовательным вычислением слагаемых и добавлением их к сумме, как на приведенной выше блок-схеме, сводит вычисления к простейшим арифметическим операциям, то есть первая задача при этом решается. Что касается второй задачи – уменьшения количества этих операций, – то многократноеперемножение чисел в числителе (степени x) и в знаменателе (n!) вряд ли можно считать рациональным. При этом (третья задача) погрешность вычислений возрастает с увеличением номера члена ряда – слишком велики становятся и числитель, и знаменатель.
Задачи сокращения количества операций и уменьшения погрешности вычислений решает рекуррентная формула, позволяющая вычислить значение очередного члена ряда, используя уже найденное значение предыдущего. Рекуррентная формула имеет вид:
an+1 = an × Tn, где Tn – коэффициент рекурсии.
В нашем примере произвольный член ряда определяется формулой:
, где
n =
0, 1, 2, ...
Номер начального члена ряда n = 0, его значение a0 = x.
Для расчета коэффициента рекурсии
определим значение следующего (n+1)-го члена ряда.
В
формулу общего члена ряда
вместо
n подставим
(n+1),
получим
Вычисляя коэффициент рекурсии, сокращаем дробь:
Чтобы сократить факториалы, рассмотрим числитель и знаменатель отдельно:
(2n + 1)! = 1 × 2 × 3 × … × (2n + 1)
(2n + 3)! = 1 × 2 × 3 × … × (2n + 1) × (2n + 2) × (2n + 3)
Окончательная формула коэффициента рекурсии
Отсюда получаем рекуррентную формулу для вычисления членов ряда
Проверка полученной формулы убережет Вас от ошибок в алгоритме и, возможно, сэкономит усилия при отладке программы.
Подставив
n
= 0 в формулу
общего члена ряда
,
получаем a0
= x.
Далее определим по рекуррентной формуле a1 и a2, сверяя результаты с соответствующими членами ряда:
при
n
= 0
при
n
= 1
Совпадение полученных значений с членами ряда показывает, что коэффициент рекурсии рассчитан правильно.
Блок-схема алгоритма
В приведенную выше блок-схему подставим данные для расчета функции sin x, добавив вывод данных для графиков и защиту от зацикливания. Расчет текущего члена ряда на каждой итерации цикла осуществляется по полученной рекуррентной формуле.
Пояснения.
В переменной F хранится эталонное значение функции, вычисленное по стандартной программе, для последующего сравнения этого значения с полученной суммой ряда (|F–Sn|).
В процессе суммирования ряда формируются файлы с расширением .txt, содержащие таблицы зависимости значений членов ряда и частичных сумм от номера члена ряда (Блок вывода *). Таблицы состоят из строк, в которых через пробел записаны значения функции и аргумента.
!Открыть три файла
open(1, file=‘An.txt’); open(1, file=‘Sn.txt’)
open(1, file=‘F.txt’)
!Вывод данных для графика
write(1, *) N, An; write(2, *) N, Sn
write(3, *) N, F
Эталонное значение функции F не зависит от номера члена ряда N, на графике ему соответствует линия, параллельная горизонтальной оси.
Для построения графика воспользуйтесь пакетом AGrapher.
Для предотвращения зацикливания программы из-за возможных ошибок, количество членов ряда N ограничено значением Nmax (например, 100). При N > Nmax суммирование прекращается и выдается аварийное сообщение с дополнительной информацией.
Для вывода результатов суммирования и аварийного сообщения в отладке удобно использовать оператор namelist.
В цикле do while переменная N служит для хранения номера последнего члена ряда, вошедшего в сумму. Поскольку в нашем примере члены ряда в разложении функции нумеруются с 0, то количество просуммированных членов ряда равно N+1 . Единица добавляется к N после выхода из цикла (Блок **).