Лабораторная работа. Основы работы в VBA. Алгоритмическая структура - цикл

6. Вычисление суммы бесконечного убывающего ряда с заданной точностью. Итерационные циклы

         Задача сводится к нахождению суммы

 \( S=u(1)+u(2)+. . . +u(n)= \sum_{i=1}^{ \infty }{u(n)} \),

каждое слагаемое, которой является функцией от номера n, определяющего место этого слагаемого в сумме, а также может являться функцией одного или нескольких дополнительных параметров.

         Вычисление суммы ряда состоит в получении в результате циклического процесса последовательности u(1), u(2), ..., u(n), ..., сходящейся  к своему предельному значению, т. е. \( \frac{lim}{ n \rightarrow \infty } u(n)=S \). Здесь u(n) – сумма n членов бесконечного ряда.

         Для вычисления суммы ряда используется рассмотренный выше прием накопления суммы: суммирование считается законченным при выполнении условия достижения заданной погрешности ε: |u(n)| ≤ ε. Задача нахождения суммы ряда является типичным примером итерационного процесса, так как заранее не известно, при каком числе членов ряда будет достигнута требуемая точность.

         Процесс вычисления определяется рекуррентным соотношением (т.е. к предыдущему значению прибавляется текущее) u(n)=u(n-1)+u(n). Алгоритм нахождения суммы ряда показан на рис 4.

 

Рис. 4. Вычисление суммы ряда

 В приведенной блок-схеме для вычисления суммы ряда используется рассмотренный выше прием накопления суммы. Только теперь суммирование считается законченным тогда, когда выполнится условие – значение члена ряда станет меньше заданной погрешности ε: |u(n)| ≤ ε.

         Для организации такого итерационного цикла (т.е. цикл с заранее неизвестным числом повторений) применяется оператор Do...Loop. Именно здесь проявляется удобство этого оператора, поскольку, используя, оператор For...Next, поставленную задачу решить не удается – For...Next – оператор цикла с заранее заданным числом повторений.

         Пример 1. Составить программу вычисления приближенного значения числа p, используя равенство 

\( \frac{ \pi^2 }{6} =1+ \frac{1}{2^2} + \frac{1}{3^2} + . . . +\frac{1}{i^2}= \sum_{i=1}^{ \infty }{ \frac{1}{i^2}} =S \).

 Вычисления закончить, когда значение последнего члена ряда не станет меньше 0, 0000001. Определить длину приближенного ряда.

Из условия задачи задаем погрешность ε = 0, 0000001. Число π находим по формуле \( \pi= \sqrt{6 \cdot S } \) , где S – сумма ряда, которую необходимо вычислить. Для поиска суммы S применим цикл “ДО” с постусловием.


 Sub Demo_Pi()

Dim i As Integer

Dim e, s, u, Pi As Single

i = 1

s = 0

' Задаем точность вычисления

e = 0.0000001

Do

' Вычисляем значение текущего члена ряда

u = 1 / i ^ 2

s = s + u

i = i + 1

Loop Until Abs(u) < e

Pi = Sqr(s * 6)

MsgBox "Число Пи равно " & Pi & ", число итераций равно " & i - 1, , "Решение задачи"

End Sub

 

 

Пример 2. Составить программу вычисления суммы бесконечного ряда

 \( z=1- \frac{x^2}{2} + \frac{x^4}{4} - . . . +(-1)^n \frac{x^{2n}}{2n}= 1+\sum_{i=1}^{ \infty }{ (-1)^n \frac{x^{2n}}{2n}} =S \).,

 при x<1 с точностью до члена ряда, меньшего заданной точности ε<<1.

 

Sub Demo_summa_ryada()

Dim n As Integer 'счетчик

Dim x As Single  'аргумент

Dim z As Double   'сумма

Dim u As Double    'член ряда  

Dim e As Double     'точность вычислений

x = InputBox("Введите х < 1  - ", "Запрос аргумента ряда")

e = InputBox("Введите погрешность  E<<1 -", "Запрос точности вычисления")

z = 0

n = 1

Do

' Вычисляем значение текущего члена ряда

u = (-1) ^ n * x ^ (2 * n) / (2 * n)

z = z + u

n = n + 1

Loop While Abs(u) >= e

z = z + 1      'прибавляем к вычисленной сумме первый член ряда

MsgBox "Сумма ряда равна  " & z, , "Решение задачи"

End Sub