Как составить программу для вычисления суммы ряда

В этом уроке мы расскажем как вычислить сумму бесконечного сходящегося ряда (последовательности) с определенной точностью. Будет рассмотрена соответствующая программа, написанная на языке программирования Си. В конце статьи можно скачать исходник этой программы для Visual Studio.

Сходящийся ряд — это числовая последовательность элементов множества X, имеющая предел в этом множестве.

Графическое изображение сходящегося ряда

Сходящийся ряд

Рассмотрим задачу вычисления суммы сходящегося ряда с определенной точностью на примере. Пусть дан ряд:

Вычисление суммы ряда с заданной точностью. Исходный ряд

Вычисление суммы ряда с определенной точностью ε означает, что сумма ряда вычисляется до тех пор, пока модуль разности между текущим и предыдущим членом последовательности больше ε. В виде формулы это утверждение можно записать так:    |an — an-1| > ε, то есть пока это выражение истинно, вычисления продолжаются.

Сначала напишем на языке Си функцию, которая будет вычислять и возвращать значение k-го члена ряда по переданному в нее значению k.

double f(int k)

{

    double res;

    res = 32.0;

    res *= (double)powf(0.5, k);

    return res;

}

res — это переменная вещественного типа повышенной точности double, в которую будет записан результат вычисления k-го члена ряда. Это же значение и будет возвращаться функцией.

Выражение res *= (double)powf(-0.5, k); эквивалентно выражению res = res * (double)powf(-0.5, k);

Оператор powf — это оператор возведения числа в степень. В нашем случае он вычисляет: -0.5k.

Функцию f можно записать короче:

double f(int k)

{

    return 32.0 * powf(0.5, k);

}

Теперь перейдем к функции main. Для начала считаем с консоли число e — это и будет заданная точность вычислений ε.

float e;

printf(“e = “);

scanf_s(“%f”, &e);

Объявим переменные, в которых будут хранится: значение предыдущего, значение текущего члена ряда, сумма ряда и номер текущего члена ряда (число k) соответственно.

double previous, current;

double sum = 0;

int k = 0;

Отдельно вычислим первый член ряда (потом он станет «предыдущим»), чтобы затем перейти к вычислениям в цикле.

current = f(k);

sum += current;

k++;

Запись выражения sum += current; эквивалентна записи: sum = sum + current;

Теперь перейдем к вычислениям в цикле. Условием выхода из цикла будет ложность выражения: |an — an-1| > ε.

do

{

    previous = current;

    current = f(k);

    sum += current;

    k++;

} while (abs(current previous) > e);

Сумма посчитана. Осталось вывести результат вычислений в консоль.

printf(“sum = %fn”, sum);

В итоге код программы с необходимыми подключенными библиотеками будет выглядеть следующим образом:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

#include <stdio.h>

#include <math.h>

#include <conio.h>

double f(int k)

{

    double res;

    res = 32.0;

    res *= (double)powf(0.5, k);

    return res;

}

int main()

{

    float e;

    printf(“e = “);

    scanf_s(“%f”, &e);

    double previous, current;

    double sum = 0;

    int k = 0;

    current = f(k);

    sum += current;

    k++;

    do

    {

        previous = current;

        current = f(k);

        sum += current;

        k++;

    } while (abs(current previous) > e);

    printf(“sum = %fn”, sum);

    _getch();

    return 0;

}

Оператор _getch(); в строке 34 нужен для того, чтобы консоль не закрывалась сразу по завершении исполнения программы.

Демонстрация работы программы для нашего ряда представлена на скриншоте ниже. Точность вычислений составляет: ε = 0.01.

Вычисление суммы ряда с заданной точностью. Работа программы

Скачать исходник

Перейти к содержанию

Сумма элементов ряда чисел

Просмотров 3.4к. Обновлено 15 октября 2021

Найти сумму n элементов следующего ряда чисел:
1 -0.5 0.25 -0.125 …
Количество элементов (n) вводится с клавиатуры.

В данном случае ряд чисел состоит из элементов, где каждый следующий меньше предыдущего в два раза по модулю и имеет обратный знак. Значит, чтобы получить следующий элемент, надо предыдущий разделить на -2.

Какой-либо переменной надо присвоить значение первого элемента ряда (в данном случае это 1). Далее в цикле добавлять ее значение к переменной, в которой накапливается сумма, после чего присваивать ей значение следующего элемента ряда, разделив текущее значение на -2. Цикл должен выполняться n раз.

Следует отметить, что чем больше n, тем меньше меняется сумма от прибавления каждого следующего элемента, т.к. на каждой итерации цикла значение элемента уменьшается в два раза (по модулю), т.е. прибавляется все меньшая и меньшая величина. Попробуйте выполнить программу, введя в качестве значения n сначала 3, затем 10 и 20. Вы увидите, что разница между первым и вторым случаем значительна, а между вторым и третьим — нет.

Pascal

сумма ряда паскаль


var
n,i: byte;
e,s: real;
begin
readln(n);
e := 1;
s := 0;
for i:=1 to n do begin
s := s + e;
e := e / -2;
end;
writeln(s:9:7);
end.



6
0.6562500

Язык Си


#include

main() {
unsigned short n,i;
float e, s;
scanf("%d",&n);
e = 1;
s = 0;
for (i=0;i< n;i++) {
s += e;
e /= -2;
}
printf("%.7fn",s);
}



10
0.6660156

Python

сумма ряда python (питон)


n = int(input())
e = 1
s = 0
for i in range(n):
s += e
e /= -2
print(s)



4
0.625

КуМир


алг сумма рядя
нач
цел n,i
вещ e,s
ввод n
e := 1
s := 0
нц для i от 1 до n
s := s + e
e := e / 2 * (-1)
кц
вывод s
кон



4
0.625

30
0.6666667

Basic-256


input n
start = 1
sum = 0
for i=1 to n
sum = sum + start
start = start / -2
next i
print sum



20
0.666666

Перейти к содержимому

Вычисление суммы ряда – пример использования цикла while.

Требуется вычислить в цикле сумму вещественного ряда и сравнить её со значением, вычисляемым по контрольной формуле. Рассмотрим на примере знакопеременного ряда

В этом ряде у каждого следующего члена меняется знак. Известно, что погрешность частичной суммы этого ряда не превосходит модуль последнего члена суммы. То есть

Поэтому для вычисления суммы ряда можно составить следующую программу:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

#include <iostream.h> // подключаем ввод/вывод – функции cin/cout

#include <math.h> // подключаем exp и fabs

#include <conio.h> // подключаем getch

int main()

{

  double x; // точка, в которой будет высчитываться значение ряда

  double eps = 0.001; // погрешность, с которой будет вычисляться значение ряда

  double an, sum; // текущий an и текущая сумма ряда

  double n; // текущий номер

  cin>>x;//вводим с клавиатуры x

  an = 1;

  sum = 1;

  n = 0;

  // значение ряда будем вычислять в цикле while

  while (fabs(an)>eps)

  {

n = n + 1.0;

an = an * x / n;

sum = sum + an;

  }

  cout << sum << ” “; // выводим сумму

  cout << exp(x); // выводим значение, подсчитанной по контрольной формуле exp(x)

  getch(); // ждём нажатия клавиши

}

В этой программе есть подключение заголовочных файлов (#include), объявление переменных вещественного типа (double), ввод и вывод с клавиатуры (cin/cout), getch. Но, пожалуй, самым основным является кусок кода:

  an = 1;

  sum = 1;

  n = 0;

  // значение ряда будем вычислять в цикле while

  while (fabs(an)>eps)

  {

n = n + 1.0;

an = an * x / n;

sum = sum + an;

  }

В первых трех строках этого куска кода переменным присваиваются значения. Затем начинается цикл while. Этот цикл идёт пока значение модуля члена ряда an больше погрешности эпсилон.

На каждом шаге цикла увеличивается на 1 значение n. Затем считается значение очередного члена ряда an. Стоит отметить, что используется следующее наблюдение Вычисленное значение an приплюсовывается к сумме.

Перейти к содержанию

На чтение 1 мин Просмотров 12.6к. Опубликовано 21 ноября, 2021 Обновлено 21 ноября, 2021

Дано натуральное число N. Напишите программу для вычисления следующей суммы ряда (начиная с единицы):

Задача. Сумма ряда (Python)

Что оценивается

Задание считается успешно выполненным, если:

  • результат вывода соответствует условию;
  • input содержит корректное приглашение для ввода;
  • переменные имеют значащие имена, не только a, b, c, d.

Допускается вывод без описания, достаточно вывести сумму ряда.

Советы и рекомендации

Обратите внимание: если мы воспользуемся формулой для расчёта члена ряда, то 

при n = 0, член ряда равен 1;

при n = 1, мы получим -1/2;

при n = 2, мы получим 1/4;

при n = 3, мы получим -1/8.

Решение задачи:

number = int(input('Введите натуральное число: '))
s = 1
x = 1
for n in range(1, number + 1):
    x = ((-1) ** n) / (2 ** n)
    s = x + s
print('Член ряда ', x,'сумма ряда ', s)

( 37 оценок, среднее 4.3 из 5 )

13 / 12 / 5

Регистрация: 16.08.2014

Сообщений: 150

1

Вычислить сумму ряда

27.09.2014, 14:54. Показов 15203. Ответов 16


Студворк — интернет-сервис помощи студентам

1)Составить программу вычисления суммы первых n=10; 20; 30 членов ряда:
2)Составить алгоритм и написать программу вычисления следующих сумм
3)Составить программу и вычислить сумму ряда с точностью https://www.cyberforum.ru/cgi-bin/latex.cgi?varepsilon =10^-3 и https://www.cyberforum.ru/cgi-bin/latex.cgi?varepsilon =10^-6 . Сравнить число итераций для каждого из этих случаев.
4)Составить программу вычисления суммы первых n=10; 20; 30 членов ряда:
S=1-1/22+1/32-1/42+…
S=1/(1*2*3)+1/(2*3*4)+1/(3*4*5)+…
Меня больше интересует объяснение ,пояснение, а не готовая программа .Я не знаю что обозначает знак https://www.cyberforum.ru/cgi-bin/latex.cgi?sum и зачем он нужен? .Программы надо написать с помощью цикла repeat-until .
Заранее спасибо



0



CodeR

Фрилансер

3417 / 2814 / 3000

Регистрация: 08.02.2012

Сообщений: 8,539

Записей в блоге: 1

27.09.2014, 14:59

2

MIcov15, Это знак суммы,т.е. надо суммировать члены ряда в зависимости от параметра

Добавлено через 1 минуту

Pascal
1
2
For k:=1 to n do
 sum:=sum+1/((2*k-1)*(2*k+1))



1



13 / 12 / 5

Регистрация: 16.08.2014

Сообщений: 150

28.09.2014, 13:10

 [ТС]

3

напишите несколько примеров если можно



0



CodeR

Фрилансер

3417 / 2814 / 3000

Регистрация: 08.02.2012

Сообщений: 8,539

Записей в блоге: 1

28.09.2014, 13:24

4

Цитата
Сообщение от MIcov15
Посмотреть сообщение

напишите несколько примеров если можно

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Const n=20;//количество членов ряда для вычисления суммы
Var sum:real;//сумма членов ряда
    k:integer;//переменная для цикла
Begin
    k:=0;//инициализируем переменную цикла
    Repeat
      inc(k);//увеличиваем на 1 переменную цикла
      //вычисляем очередной член ряда и прибавляем его к общей сумме
      sum:=sum+1/((2*k-1)*(2*k+1));
    Until k=n;//когда (k) станет равной n,выходим из цикла
    writeln('S = ',sum:0:6);
    writeln('1/2 = ',1/2:0:6);
    readln;
End.



1



Почетный модератор

64284 / 47583 / 32739

Регистрация: 18.05.2008

Сообщений: 115,182

28.09.2014, 13:30

5

Цитата
Сообщение от MIcov15
Посмотреть сообщение

напишите несколько примеров если можно

Да, примерно 5 из тех что в первом посте..



0



MIcov15

13 / 12 / 5

Регистрация: 16.08.2014

Сообщений: 150

28.09.2014, 14:27

 [ТС]

6

Правильно ли я написал задание 2 из первого ряда миниатюр?

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
var k,a,x,n: integer;
sum:real;
begin
a:=-1;
n:=10;
writeln('Ââåäèòå ÷èñëî õ>1');
readln(x) ;
for k:=0 to n do
sum:=a*(k+1)*1/(2*k+1)*x*(2*k+1);
sum:=sum+pi/2;
writeln(sum:1:3,' ',arctan(x)>sum);
readln;
end.

А во втором примере задания 2 надо один раз в конце умножать на 2 или каждый раз?



0



Почетный модератор

64284 / 47583 / 32739

Регистрация: 18.05.2008

Сообщений: 115,182

28.09.2014, 14:31

7

Цитата
Сообщение от MIcov15
Посмотреть сообщение

Правильно ли я написал задание 2 из первого ряда миниатюр?

Запусти программу и сравни полученную сумму с arctg(x)



0



13 / 12 / 5

Регистрация: 16.08.2014

Сообщений: 150

28.09.2014, 14:34

 [ТС]

8

забыл про repeat-until ,но это не важно

Добавлено через 1 минуту
при вводе числа 3 ,выдает -31,429 true

Добавлено через 1 минуту
при любом x ,в ответе после запятой 429



0



Puporev

Почетный модератор

64284 / 47583 / 32739

Регистрация: 18.05.2008

Сообщений: 115,182

28.09.2014, 15:59

9

Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Вообще это решается так

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
uses crt;
var x,t,s:real;
    n,k:integer;
begin
clrscr;
repeat
write('|x|>1 x=');
readln(x);
until abs(x)>1;
write('n=');
readln(n);
k:=0;
t:=-1/x;
s:=t;
for k:=1 to n do
 begin
  t:=-t/(x*x);
  s:=s+t/(2*k+1)
 end;
if x<0 then s:=-pi/2+s
else s:=pi/2+s;
writeln('s=',s:0:5);
writeln('arctg=',arctan(x):0:5);
readln
end.



0



13 / 12 / 5

Регистрация: 16.08.2014

Сообщений: 150

28.09.2014, 17:37

 [ТС]

10

не совсем понял ,а где же https://www.cyberforum.ru/cgi-bin/latex.cgi?sum_{k=0}^{n}(-1)^{k+1} ,напишите пояснения к программе



0



Puporev

Почетный модератор

64284 / 47583 / 32739

Регистрация: 18.05.2008

Сообщений: 115,182

28.09.2014, 17:41

11

Цитата
Сообщение от MIcov15
Посмотреть сообщение

а где же

Вот здесь

Pascal
1
t:=-t/(x*x);//смена знака очередного члена



0



13 / 12 / 5

Регистрация: 16.08.2014

Сообщений: 150

28.09.2014, 17:44

 [ТС]

12

точнее к строкам 13-19

Добавлено через 3 минуты
до меня не доходит) ,а зачем делить на (x*x)



0



Puporev

Почетный модератор

64284 / 47583 / 32739

Регистрация: 18.05.2008

Сообщений: 115,182

28.09.2014, 17:48

13

Pascal
1
2
3
4
5
6
7
8
k:=0;  //нулевой член ряда
t:=-1/x; //его значение
s:=t; //начальная сумма
for k:=1 to n do //считаем остальные
 begin
  t:=-t/(x*x); //меняем знак и делим на x^2=(-1)^(k+1)/x^(2k+1)
  s:=s+t/(2*k+1) //делим на 2k+1 и прибавляем
 end;



1



13 / 12 / 5

Регистрация: 16.08.2014

Сообщений: 150

28.09.2014, 17:48

 [ТС]

14

может ли кто-то разжевать мне этот пример ?

Добавлено через 15 секунд
спасибо



0



Почетный модератор

64284 / 47583 / 32739

Регистрация: 18.05.2008

Сообщений: 115,182

28.09.2014, 17:51

15

Цитата
Сообщение от MIcov15
Посмотреть сообщение

а зачем делить на (x*x)

Потому что в условии написано 1 /x^(2k+1)
к=0 1/x
k=1 1/(x*x*x)
k=2 1/(x*x*x*x*x)
………………



0



0 / 0 / 1

Регистрация: 09.10.2015

Сообщений: 14

09.10.2015, 22:06

16

А если такая формула?
Найти сумму ряда чисел (-1)^i/(2*i), где i=1 и изменяется до n
Как задать смену знака через один член?



0



Puporev

Почетный модератор

64284 / 47583 / 32739

Регистрация: 18.05.2008

Сообщений: 115,182

09.10.2015, 22:44

17

Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Посмотри пост #13 строка 6

Добавлено через 8 минут

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
uses crt;
var n,i:integer;
    t,s:real;
begin
clrscr;
write('n=');
readln(n);
i:=1;  {первый член ряда}
t:=-1; {его значение числителя}
s:=t/2; {начальная сумма}
for i:=2 to n do {считаем остальные}
 begin
  t:=-t; {меняем знак}
  s:=s+t/(2*i) {делим на 2i и прибавляем}
 end;
write('S=',s:0:3);
readln
end.



1



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

09.10.2015, 22:44

17

Добавить комментарий