Сумма степенного ряда - приближенное вычисление функции
Задание
1. Составить программу Pro1, которая для рекомендованного значения аргумента x = x0 и заданного значения точности ε:
a) вычисляет значение функции f(x0) со встроенной функцией;
b) вычисляет приближенное значение Sn(x0), суммируя столько членов ряда Тейлора, сколько требуется для заданной точности ε;
c) формирует три текстовых файла для пакета AGrapher:
- зависимость членов ряда an от n;
- зависимость частичных сумм ряда Sn от n;
- значение встроенной функции f(x0), одно и то же при всех n;
дляпостроения графиков принять ε = 10-3;
d) выводит в файл Out.txt результаты с пояснениями, включая:
- значение ε;
- значение аргумента x = x0;
- f(x0), вычисленное по стандартной программе;
- Sn - сумма ряда, как приближение функции;
- n - количество членов ряда в частичной сумме ряда;
- модуль разности f(x0) и суммы ряда Sn.
2. С помощью пакета AGrapher построить графики зависимостей по текстовым файлам An.txt, Sn.txt, f.txt, созданным в программе Pro1.
3. Составить программу Pro2, модифицировав программу Pro1:
a) исключить формирование текстовых файлов для графиков;
b) результаты вычислений оформить в виде таблицы (каждая строка таблицы соответствует одному значению x и содержит форматированные результаты);
c) значение аргумента x функции f(x) изменять от xnдо xk с шагом Δx из расчета10 – 15 строк в таблице.
4. Выполнить программу Pro2дважды с разной степенью точности ε:
a) различимой визуально на графике;
b) достижимой для Real - одинарной точности.
Содержание отчета
1. Название работы, номер варианта индивидуального задания.
2. Фамилия, имя, отчество и номер группы студента.
3. Вариант индивидуального задания (функция, её разложение в ряд Тейлора и область определения аргумента функции).
4. Рекуррентная формула и расчет коэффициента рекурсии с последующей его проверкой для двух членов ряда.
5. Блок-схемы и распечатки текстов программ Pro1иPro2.
6. Распечатка результатов работы программы Pro1.
7. Рисунок или распечатка графиков, построенных в AGrapher по трем файлам, созданным в Pro1.
8. Распечатки двух таблиц с результатами программы Pro2.
При подготовке к защите ответить на контрольные вопросы.
Справочная информация
1. Запись бесконечного ряда Тейлора:
, здесь an – общий член ряда;
S0, S1,… Sn,… называют частичными суммами бесконечного ряда,
S0 = a0 , S1 = a0 + a1, …, , …
2. Сходящимся называется ряд, у которого последовательность частичных сумм имеет конечный предел S, т.е. , иначе ряд называется расходящимся. S называется суммой сходящегося ряда. Нахождение частичной суммы Sn – цель лабораторной работы.
3. Величина n! называется “n-факториал” и вычисляется по формуле
n! = 1 × 2 × … × (n – 1) × n = (n – 1)! × n или при 0! = 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 при изменении значения точности ε, покажите на своих результатах. Объясните, почему.
Пример контрольного задания
1. Вывод формулы коэффициента рекурсии с проверкой для двух членов ряда (задача, аналогичная вариантам индивидуальных заданий).
2. Составьте блок-схему и напишите оператор do while для вывода в файл Out.txt значений aи b= , при a = 8 и каждом следующем a, равном половине предыдущего с противоположным знаком. Выполнение цикла прекратить при недопустимом значении a.
a) a и b выводить по формату “E9.3” с названиями переменных.
b) Показать все выводимые строки с пробелами.
c) Чему равно значение aпосле выхода из цикла?
3. Как будут выглядеть выведенные строки (покажите с пробелами)? На каком устройстве?
Real:: f=2700000, z=-0.00017
write (*,4) f, z; write (*, 5) f, z
4 Format (F7.1); 5 Format (2E9.2)
4. Напишите Format, соответствующий выводу строки (символ «˜» означает пробел):
˜:˜˜.68E-04˜:˜˜.75E-02˜:˜˜.13E-03˜:
Таблица 8.
Варианты индивидуальных заданий «Сумма степенного ряда»
Значения a0 и x0 рекомендуются для программы Pro1.
№ | Разложение функции в степенной ряд | Аргумент |
![]() ![]() | ![]() | |
Гиперболический косинус ![]() | ![]() | |
![]() | ![]() | |
![]() | ![]() | |
![]() ![]() | ![]() | |
![]() | ![]() | |
![]() | ![]() | |
![]() | ![]() | |
![]() ![]() | ![]() | |
![]() ![]() | ![]() | |
![]() | ![]() | |
![]() ![]() | ![]() | |
![]() ![]() | ![]() | |
![]() | ![]() | |
Гиперболический синус ![]() | ![]() | |
![]() | ![]() | |
![]() | ![]() | |
![]() | ![]() | |
![]() | ![]() | |
![]() | ![]() | |
![]() | ![]() | |
![]() | ![]() | |
![]() | ![]() | |
![]() ![]() | ![]() | |
![]() | ![]() | |
![]() | ![]() | |
![]() | ![]() | |
![]() ![]() | ![]() | |
![]() ![]() | ![]() | |
![]() | ![]() |