Задача «Вычисление суммы ряда»

Постановка задачи. Разработать программу для приближённого вычисления суммы бесконечного ряда при заданном аргументе x с заданной точностью e. Для перехода к следующему слагаемому использовать рекуррентное соотношение. Для проверки полученного результата вычислить также значение по контрольной формуле . Форматировать выходные данные в соответствии с введённой точностью.

Шаг 1. Общая структура программы

Программа на процедурном языке программирования состоит из данных и действий по их обработке. program SeriesSum; { Описание данных – констант, типов и переменных } begin { Обработка данных } end.

Шаг 2. Разработка структуры данных

Из постановки задачи видно, что задаются аргумент x и точность e и надо получить сумму ряда s и значение y, вычисляемое по контрольной формуле. program SeriesSum; var { Входные данные } x, e: real; { вещ x - аргумент, вещ e - точность } { Выходные данные } s, y: real; { вещ s - сумма ряда, вещ y - значение по контрольной формуле } begin { Обработка данных } end.

Шаг 3. Разработка тестов

№ теста Входные данные Ожидаемые результаты Смысл теста
1 x = 0.2, e = 0.001 s = 0.187951
y = 0.187976

Выбираем несколько значение аргумента из возможного диапазона. Задаём разные значения точности. Количество совпадающих цифр в значениях s и у обычно зависит от введённой точности.

2 x = 0.5, e = 0.0001 s = 0.434167
y = 0.434143
3 x = 0.9, e = 0.000001 s = 0.715687
y = 0.715687

Шаг 4. Разработка общей структуры программы

Программа должна состять из трёх основных частей – ввод исходных данных, получение результатов, вывод полученных результатов. program SeriesSum; var { Входные данные } x, e: real; { вещ x - аргумент, вещ e - точность } { Выходные данные } s, y: real; { вещ s - сумма ряда, вещ y - значение по контрольной формуле } begin { Ввод исходных данных } { Вычисление суммы ряда и значения по контрольной формуле } { Вывод результатов } end.

Шаг 5. Разработка ввода и вывода

Запрограммируем ввод и вывод согласно входной и выходной форме. Для проверки вывода напишем пока так называемую «заглушку» – она заменяет полноценные вычисления каким-либо простым присваиванием. В данном случае можно переменным s и y присвоить значение x. Для форматирования выходных данных в соответствии с введённой точность, необходимо вычислить количество знаков после запятой в переменной e. Это можно сделать через логарифм значения этой переменной.

Входная форма

Выходная форма

program SeriesSum; var { Входные данные } x, e: real; { вещ x - аргумент, вещ e - точность } { Выходные данные } s, y: real; { вещ s - сумма ряда, вещ y - значение по контрольной формуле } { Промежуточные данные } k: integer; { цел k - количество знаков после запятой } begin { Ввод исходных данных } write('Введите аргумент: '); readln(x); write('Введите точность: '); readln(e); { Вычисление суммы ряда и значения по контрольной формуле – заглушка } s := x; y := x; { Вывод результатов } k := ... writeln('Сумма ряда = ', s:(k + 3):k); writeln('Контрольная формула = ', y:(k + 3):k); end.

Шаг 6. Разработка вычислительной части программы

Чтобы не вычислять сумму бесконечного ряда (что невозможно), будем вычислять сумму ряда с заданной точностью, для чего надо отбросить последние слагаемые, т.е. цикл прекращается, когда модуль очередного слагаемого становится меньше заданной точности. Для сокращения вычислений будем использовать рекуррентное соотношение, которое позволяет получить i-ое слагаемое, умножив (i – 1)-ое слагаемое на некоторое выражение (о рекуррентных соотношения см. соответствующее практическое занятие).

При разработке метода становится понятно, что для вычислений нужны также переменные для хранения очередного слагаемого и номера текущего слагаемого. Добавим эти промежуточные данные в раздел описания переменных. program SeriesSum; var { Входные данные } x, e: real; { вещ x - аргумент, вещ e - точность } { Выходные данные } s, y: real; { вещ s - сумма ряда, вещ y - значение по контрольной формуле } { Промежуточные данные } a: real; { вещ a - слагаемое } i: integer; { цел i - номер слагаемого } k: integer; { цел k - количество знаков после запятой } begin { Ввод исходных данных } write('Введите аргумент: '); readln(x); write('Введите точность: '); readln(e); { Вычисление суммы ряда } a := x; s := a; i := 2; while abs(a) > e do begin a := a * -x * (3 * i - 4) / (3 * i); s := s + a; i := i + 1; end; { Вычисление значения по контрольной формуле } y := 3 * power(1 + x, 1 / 3) - 3; { Вывод результатов } k := ... writeln('Сумма ряда = ', s:(k + 3):k); writeln('Контрольная формула = ', y:(k + 3):k); end.