Комментарии к заданию. 1. Обратите внимание на то, что в Вашем индивидуальном задании:
1. Обратите внимание на то, что в Вашем индивидуальном задании:
a) список членов ряда может начинаться не с «a0», а с «a1» (начальное значение для n=1);
b) a0 (или a1) может быть функцией от x или константой;
c) сумме может предшествовать слагаемое или сомножитель.
2. При суммировании ряда необходимо решить следующие задачи:
a) свести вычисления к простейшим арифметическим операциям;
b) уменьшить число этих операций и время расчета;
c) уменьшить погрешность вычислений.
Эти задачи решает рекуррентная формула, позволяющая вычислить значение очередного члена ряда, используя уже найденное значение предыдущего. Рекуррентная формула имеет вид:
an+1 = an × Tn, где Tn – коэффициент рекурсии.
3. Возможно суммирование только конечного количества членов ряда. Для сходящегося ряда . Следовательно,начиная с некоторого n, отношение |an| > ε перестанет выполняться для любого положительного ε. Этим значением n и следует ограничиться при суммировании бесконечного ряда.
4. Во избежание зацикливания программы вследствие ошибок, значение n следует ограничить, для чего в программе предусмотрена переменная Nmax (равная, например, 100). При n > Nmax суммирование прекращается и выдается сообщение с дополнительной информацией (в том числе значение an).
Аварийное сообщение может появиться, если:
a) значение |an| приближается к ε, но, возможно, ряд просто «не успел» сойтись и достаточно просто увеличить значение Nmax ;
b) значение |an| на порядки превышает ε, то есть ряд не сходится. В этом случае следует проверить:
- находится ли x в области определения аргумента;
- достижима ли задаваемая погрешность вычислений ε при использовании Real – одинарной точности вещественных переменных;
- на ошибки в рекуррентной формуле, алгоритме, программе.
Пример
Рассмотрим вычисление функции sin x. Разложение этой функции в ряд Тейлора имеет следующий вид
Расчет коэффициента рекурсии
Формула для вычисления общего члена ряда
, где n = 0, 1, 2, ...
При n = 0, a0 = x. Каждый следующий член ряда an+1 можно вычислить с помощью рекуррентной формулы
an+1 = an × Tn, где n = 0, 1, 2, … .
Коэффициент рекурсии Tnопределяется из соотношения
, где n = 0, 1, 2, … .
Выполним подстановки
– подставлено n+1 вместо n
– подставлено an+1, an
Чтобы сократить факториалы, приведем числитель и знаменатель отдельно
(2n + 1)! = 1 × 2 × 3 × … × (2n + 1)
(2n + 3)! = 1 × 2 × 3 × … × (2n + 1) × (2n + 2) × (2n + 3)
Коэффициент рекурсии
Рекуррентная формула для расчетов
Проверка рекуррентной формулы
Подставив n = 0 в формулу общего члена ряда an, получаем a0 = x.
Далее определим по рекуррентной формуле a1 и a2, сверяя результаты с соответствующими членами ряда:
при n = 0
при n = 1
Совпадение полученных значений с членами ряда показывает, что коэффициент рекурсии выведен правильно.
Блок-схема алгоритма суммирования ряда
В алгоритме реализуются те же действия, что и при проверке рекуррентной формулы.
Одна переменная an используется в программе при вычислении всех членов ряда a0 , a1 , … an , принимая перечисленные значения по очереди.
Суммирование членов ряда выполняется в цикле
do while «пока |An| > eps», аварийный выход из цикла при N > Nmax.
Рис.3. Блок-схема алгоритма суммирования ряда
Программа суммирования ряда для одного значения аргумента
Program Pro1 ! суммирование ряда – первая версия – для одного х
! студент (фамилия, имя) группа № работа № вариант №
Implicit None
Real:: x = 1.1 ! рекомендованный x0 в радианах
Real:: eps = 1E-04 ! методическая погрешность
Integer:: N ! номер члена ряда
Integer:: Nmax=100 ! максимально допустимое значение члена ряда
Real An, Sn, F ! член ряда A0,A1,A2..An, сумма, функция
Real Delta ! модуль разности между Sn и F
! список переменных, выводимых при достижении заданной точности:
Namelist/result/ x, F, Sn, n, Delta
! список переменных, выводимых при аварийном предупреждении:
Namelist /avaria/ x, An, Sn, F, N, Nmax
!-------------начало выполнения программы
Open(1,file=’Out.txt’)! файл с результатами
Open(2,file=’An.txt’)! файл для AGrapher - зависимость An от N
Open(3,file=’Sn.txt’)! файл для AGrapher- зависимость Sn от N
Open(4,file=’F.txt’)! файл для AGrapher - F (одинаково при всех N)
Write(1, *) ’Точность вычисления ’, eps
Суммирование ряда, используя do while, выполнить по блок-схеме, приведенной выше; внести изменения с учетом индивидуального задания. Для вывода аварийного сообщения используйте оператор Write(1,avaria)
! РАСЧЕТ ЗАКОНЧЕН
Delta=ABS(F–Sn)! модуль разности между суммой Sn и функцией F
Write(1,result) ! вывод результатов
End Program Pro1
Результаты работы Pro1
1. Файл Out.txt, в который выведены исходные данные (eps и x) и вычисленные значения F, Sn, n, Delta = ABS(F – Sn).
Если Delta<eps, то результаты удовлетворительны.
Соотношение Delta>epsозначает, что ряд сходится, но не к ожидаемому значению. В этом случае следует проверить:
- достижима ли задаваемая погрешность вычислений ε при использовании вещественных переменных типа Real. Возможно, следует использовать переменные типа Real*8;
- рекуррентную формулу, алгоритм и программу.
2. Файлы An.txt, Sn.txt, F.txt с данными для графиков. Построив графики с помощью пакета AGrapher, убедитесь, что
, .
Программа Pro2, дополненная циклом по значениям аргумента х
Для программы Pro2 создать проект, скопировать в него текст Pro1 для дальнейших изменений, которые следует проводить в два этапа.
1. Повторить суммирование для 10 – 15 значений x из [xm , xk] с шагом xh ивывести неформатированные результаты для каждого x
Program Pro2 ! суммирование ряда для различных значений x
. . .
Real:: xm=-1.6, xk=1.6, xh=0.2 ! границы и шаг изменения х
!!! Исключить открытие файлов для AGrapher и вывод в них
Do x = xm, xk+xh/2, xh ! добавить цикл
!*** по окончании суммирования ряда для x, выполненного как в Pro1
Write(1,*) ’x=’, x, ’ F=’, F, ’ Sn=’, Sn, &
’n=’, n, ’ |F-Sn|=’, Delta ! вывод строки таблицы
EndDo
End Program Pro2
Рассмотреть результаты, сравнив Delta и eps; если удовлетворяется Delta<eps для всех значений x, перейти к следующему этапу.
2. Окончательная редакция программы с форматным выводом
a) добавить операторы Format для вывода строки таблицы
Write(1,12) x, F, Sum, N, Delta !
12 Format &! внутри цикла по x
(’|’,F6.1,2(’ |’, F7.4),’ |’,I7,4x,’ |’,e9.2,’ |’)
b) «шапку» и «донышко» таблицы можно “пририсовать” прямо в файле out.txt, выведенном по формату пункта (a), а затем скопировать получившиеся строки в форматы, подобные показанным ниже
Write(1,10) eps ! методическая погрешность и шапка таблицы
10 Format(’Точность вычисления ряда ’,E7.1 /& ! до цикла по x
’+-------+---------+---------+-----------+----------+’/&
’| x | станд | Тейлор |Членов ряда| Разница |’/&
’+-------+---------+---------+-----------+----------+’)
11 Format& ! «донышко» таблицы
(’+-------+---------+---------+-----------+----------+’)
Write(1,11) ! после цикла по х вывод «донышка» таблицы
Примечание. Выбор формата для вывода значений функции f(x) и суммы ряда определяется значением точности ε; например, при ε = 10–3 достаточно выводить эти значения с точностью до третьего десятичного знака, при ε = 10–5 – с точностью до пятого знака и т.д. (всего в числе 7 знаков).
Контрольные вопросы к защите работы
1. Что такое сходящийся ряд? Условие сходимости ряда (предел). Покажите на графике для своего задания.
2. При каком условии прекращается суммирование ряда в выбранном алгоритме? Каков геометрический смысл точности ε?
3. Зачем в алгоритм введено ограничение количества членов ряда? Каковы возможные причины нарушения этого ограничения? Значения каких переменных помогут понять его причину?
4. Зачем нужна рекуррентная формула?
5. Зачем нужна проверка вычислений? Проверьте коэффициент рекурсии для своего варианта работы на примере элемента a11.
6. Что можно сказать о значении функции, вычисленном по стандартной программе, будет ли оно точным? Значения каких переменных вычисляются точно?
7. С какой целью в программах используют цикл do while?
8. С какой целью в программах используют оператор exit?
9. Напишите операторы, соответствующие выводу строки (символ «˜» означает пробел): «при˜х˜=˜0.05˜sin(x)˜=˜˜.85E-05»
10. Как компактнее записать формат
1 Format(’|’,F12.7, ’|’, F12.7, ’|’, F12.7, ’|’)
11. Исправьте ошибку
Real:: f;integer:: n
write (1,7) f, n
7 Format (I6, 5x, ’|’, e11.4)
12. Как в программе Pro1 заменить цикл do while бесконечным циклом do? Приведите блок-схему и фрагмент программы.
13. Что меняется в результатах программы Pro2 при изменении значения точности ε, покажите на своих результатах. Объясните, почему.
Дата добавления: 2016-02-13; просмотров: 799;