В этом уроке мы расскажем как вычислить сумму бесконечного сходящегося ряда (последовательности) с определенной точностью. Будет рассмотрена соответствующая программа, написанная на языке программирования Си. В конце статьи можно скачать исходник этой программы для 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
Язык Си
#includemain() {
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.62530
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. Напишите программу для вычисления следующей суммы ряда (начиная с единицы):
Что оценивается
Задание считается успешно выполненным, если:
- результат вывода соответствует условию;
- 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 членов ряда:
0 |
CodeR Фрилансер 3417 / 2814 / 3000 Регистрация: 08.02.2012 Сообщений: 8,539 Записей в блоге: 1 |
||||
27.09.2014, 14:59 |
2 |
|||
MIcov15, Это знак суммы,т.е. надо суммировать члены ряда в зависимости от параметра Добавлено через 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 |
|||
напишите несколько примеров если можно
1 |
Почетный модератор 64284 / 47583 / 32739 Регистрация: 18.05.2008 Сообщений: 115,182 |
|
28.09.2014, 13:30 |
5 |
напишите несколько примеров если можно Да, примерно 5 из тех что в первом посте..
0 |
MIcov15 13 / 12 / 5 Регистрация: 16.08.2014 Сообщений: 150 |
||||
28.09.2014, 14:27 [ТС] |
6 |
|||
Правильно ли я написал задание 2 из первого ряда миниатюр?
А во втором примере задания 2 надо один раз в конце умножать на 2 или каждый раз?
0 |
Почетный модератор 64284 / 47583 / 32739 Регистрация: 18.05.2008 Сообщений: 115,182 |
|
28.09.2014, 14:31 |
7 |
Правильно ли я написал задание 2 из первого ряда миниатюр? Запусти программу и сравни полученную сумму с arctg(x)
0 |
13 / 12 / 5 Регистрация: 16.08.2014 Сообщений: 150 |
|
28.09.2014, 14:34 [ТС] |
8 |
забыл про repeat-until ,но это не важно Добавлено через 1 минуту Добавлено через 1 минуту
0 |
Puporev Почетный модератор 64284 / 47583 / 32739 Регистрация: 18.05.2008 Сообщений: 115,182 |
||||
28.09.2014, 15:59 |
9 |
|||
Сообщение было отмечено Памирыч как решение РешениеВообще это решается так
0 |
13 / 12 / 5 Регистрация: 16.08.2014 Сообщений: 150 |
|
28.09.2014, 17:37 [ТС] |
10 |
не совсем понял ,а где же ,напишите пояснения к программе
0 |
Puporev Почетный модератор 64284 / 47583 / 32739 Регистрация: 18.05.2008 Сообщений: 115,182 |
||||
28.09.2014, 17:41 |
11 |
|||
а где же Вот здесь
0 |
13 / 12 / 5 Регистрация: 16.08.2014 Сообщений: 150 |
|
28.09.2014, 17:44 [ТС] |
12 |
точнее к строкам 13-19 Добавлено через 3 минуты
0 |
Puporev Почетный модератор 64284 / 47583 / 32739 Регистрация: 18.05.2008 Сообщений: 115,182 |
||||
28.09.2014, 17:48 |
13 |
|||
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 |
а зачем делить на (x*x) Потому что в условии написано 1 /x^(2k+1)
0 |
0 / 0 / 1 Регистрация: 09.10.2015 Сообщений: 14 |
|
09.10.2015, 22:06 |
16 |
А если такая формула?
0 |
Puporev Почетный модератор 64284 / 47583 / 32739 Регистрация: 18.05.2008 Сообщений: 115,182 |
||||
09.10.2015, 22:44 |
17 |
|||
Сообщение было отмечено Памирыч как решение РешениеПосмотри пост #13 строка 6 Добавлено через 8 минут
1 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
09.10.2015, 22:44 |
17 |