Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/25: Рейтинг темы: голосов - 25, средняя оценка - 4.60
 Аватар для inviter42
83 / 2 / 2
Регистрация: 27.11.2015
Сообщений: 163

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

05.02.2016, 17:19. Показов 5467. Ответов 26

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Задача следующая: написать программу вычисления суммы ряда с заданной точностью в заданном интервале допустимых значений аргумента.
Программа должна формировать таблицу, содержащую значения аргумента ряда, суммы ряда, количество слагаемых и контрольные значения суммы, полученные с помощью стандартных функций библиотеки. Проверить и продемонстрировать преподавателю работу программы, при этом значение суммы должно совпадать с соответствующим контрольным значением (с заданной точностью). Выходная таблица должна содержать от 5 до 10 строк.

Формула:
https://www.cyberforum.ru/cgi-bin/latex.cgi?\ln (\frac{1+x}{1-x}) = 2 \cdot \sum_{n=0}^{\infty}\frac{{x}^{2 \cdot n+1}}{2 \cdot n+1}

Моя текущая проблема в том, что я не знаю как правильно определить условие выхода из цикла по достижению заданной точности для знакопостоянного ряда.
Моя попытка:
C++
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
#include <cmath>
 
using namespace std;
 
double addCalc(double x, int n)
{
    return 2*(pow(x, 2*n + 1) / (2*n + 1));
}
 
int main()
{
    double xMin, xStep, xStepMin, xStepMax, xMax=1, sum, previousAdd, currentAdd, eps, ctrl;
    int n;
 
    cout << "Enter minimum 'x', |x|<1: ";
    cin >> xMin;
 
    xStepMin = (1 - xMin) / 5;
    xStepMax = (1 - xMin) / 10;
 
    cout << "\nGood! Now enter 'x' step.\n";
    cout << "Remember: bigger 'x' step will provide less table rows, meanwhile smaller 'x' step will provide\nmore rows.\
 Minimum amount of rows is 5, maximum - 10.\n";
    cout << "'X' step, X(" << xStepMax << ", " << xStepMin << "): ";
    cin >> xStep;
 
    cout << "\nExcelent! Now the only thing left is precision. Go ahead and enter it!\n";
    cout << "Precision 'eps': ";
    cin >> eps;
    cout << endl;
 
    double x = xMin;
    for (;fabs(x)<xMax;x+=xStep){
        ctrl = log((1+x)/(1-x));
        sum = 0;
        n = 0;
        currentAdd = addCalc(x, n);
        sum += currentAdd;
        n++;
        do{
            previousAdd = currentAdd;
            currentAdd = addCalc(x, n);
            sum += currentAdd;
            n++;
        }
        while(fabs(currentAdd-previousAdd) > eps);
 
        cout << "| x: " << x << " | sum: " << sum << " | Amount of addends: " << n+1
             << " | Control value: " << ctrl << " | Diff: " << ctrl-sum << " |\n";
    }
 
    return 0;
}
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.02.2016, 17:19
Ответы с готовыми решениями:

Вычислить значение суммы ряда с заданной точностью
Какая-то я невнимательная.непойму где у меня ошибка:( саму программку вроде и правильно сооставила, но значения при вводе а у меня не...

Вычислить значение суммы бесконечного ряда с заданной точностью e=10^-5
Вычислить значение суммы бесконечного ряда с заданной точностью e=10^-5 (представлено ниже в png),и значение функции (для проверки)...

вычислить значение суммы бесконечного ряда с заданной точностью
Всем привет! Помогите сделать шестое задание с скрина. В задании сказано, что нужно использовать рекуррентные зависимости, но я в душЕ не...

26
 Аватар для Olej
322 / 170 / 24
Регистрация: 25.03.2012
Сообщений: 712
05.02.2016, 17:43
Моя текущая проблема в том, что я не знаю как правильно определить условие выхода из цикла по достижению заданной точности для знакопостоянного ряда.
А вы можете просто использовать:
C++
1
while( currentAdd != previousAdd );
И к своему удивлению обнаружите, что это работает: вычисление будет выполняться с максимально возможной точностью на вашем типе процессора.
1
 Аватар для inviter42
83 / 2 / 2
Регистрация: 27.11.2015
Сообщений: 163
05.02.2016, 17:46  [ТС]
Olej, да, так можно, но мне-то надо именно с заданной точностью, а не с максимально возможной. Это условие задачи.
0
 Аватар для Olej
322 / 170 / 24
Регистрация: 25.03.2012
Сообщений: 712
05.02.2016, 17:49
Я как-то там не увидел заданной точности.
Преподаватель от вас хочет заданное число членов ряда + отличие их от точного значения.
0
 Аватар для inviter42
83 / 2 / 2
Регистрация: 27.11.2015
Сообщений: 163
05.02.2016, 17:51  [ТС]
Olej,
Цитата Сообщение от inviter42 Посмотреть сообщение
написать программу вычисления суммы ряда с заданной точностью в заданном интервале допустимых значений аргумента.
0
 Аватар для Olej
322 / 170 / 24
Регистрация: 25.03.2012
Сообщений: 712
05.02.2016, 18:00
Цитата Сообщение от inviter42 Посмотреть сообщение
while(fabs(currentAdd-previousAdd) > eps);
Ну напишите
C++
1
while( fabs( ( currentAdd - previousAdd ) / currentAdd ) > 1e-7 );
Если вы не хотите красивого решения.
0
 Аватар для inviter42
83 / 2 / 2
Регистрация: 27.11.2015
Сообщений: 163
05.02.2016, 18:04  [ТС]
Olej, вопрос не в красоте, а в соответствии ТЗ. Задание может быть сколь угодно изящно и элегантно выполнено, но если оно не соответствует ТЗ, то его просто не примут
Вы можете объяснить почему вы использовали
C++
1
fabs( ( currentAdd - previousAdd ) / currentAdd
Я пока что не очень понимаю эту конструкцию с точки зрения математического вычисления.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
05.02.2016, 18:26
Цитата Сообщение от inviter42 Посмотреть сообщение
Я пока что не очень понимаю эту конструкцию с точки зрения математического вычисления.
https://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{\left| \: currentAdd - previousAdd\: \right|}{currentAdd}

Добавлено через 45 секунд
inviter42, ну или так:
| currentAdd - previousAdd | / currentAdd
0
 Аватар для inviter42
83 / 2 / 2
Регистрация: 27.11.2015
Сообщений: 163
05.02.2016, 18:27  [ТС]
gru74ik, я понимаю что тут написано. Я не понимаю как оно работает.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
05.02.2016, 18:30
Цитата Сообщение от inviter42 Посмотреть сообщение
Я не понимаю как оно работает.
С этим сложнее. Я и сам не понимаю чего там в коде происходит. А разбираться лень.
0
 Аватар для inviter42
83 / 2 / 2
Регистрация: 27.11.2015
Сообщений: 163
05.02.2016, 18:32  [ТС]
gru74ik, я понимаю что происходит в коде за тем лишь исключением, когда мы выходим из цикла вот по этому условию. Точнее, почему именно по этому условию и что оно вообще делает с точки зрения математики.
0
 Аватар для Olej
322 / 170 / 24
Регистрация: 25.03.2012
Сообщений: 712
05.02.2016, 19:24
Цитата Сообщение от inviter42 Посмотреть сообщение
я понимаю что происходит в коде за тем лишь исключением, когда мы выходим из цикла вот по этому условию. Точнее, почему именно по этому условию и что оно вообще делает с точки зрения математики.
Оно проверяет, что относительные отличия между результатом на текущем и предыдущем шаге отличаются на 10E-7, т.е. 0.001%, и если различия уже меньше, то пора заканчивать.
2
 Аватар для inviter42
83 / 2 / 2
Регистрация: 27.11.2015
Сообщений: 163
07.02.2016, 14:44  [ТС]
Хм, оказалось, что проблема всё ещё актуальна. Решение с условием
C++
1
fabs( ( currentAdd - previousAdd ) / currentAdd
вычисляет значения суммы с одинаково высокой точностью, независимо от того, насколько высокая или низкая точность задана на самом деле, что, конечно, не то чтобы плохо, но не совсем соответствует заданию.
Консоль вывода

На всякий случай привожу ещё раз код:
C++
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <iostream>
#include <cmath>
 
using namespace std;
 
double addCalc(double x, int n)
{
    return 2*(pow(x, 2*n + 1) / (2*n + 1));
}
 
int main()
{
    double xMin, xStep, xStepMin, xStepMax, xMax=1, sum, previousAdd, currentAdd, eps, ctrl;
    int n;
 
    cout << "Enter minimum 'x', |x|<1: ";
    cin >> xMin;
 
    xStepMin = (1 - xMin) / 5;
    xStepMax = (1 - xMin) / 10;
    cout << "'X' step, X(" << xStepMax << ", " << xStepMin << "): ";
    cin >> xStep;
 
    cout << "Precision 'eps': ";
    cin >> eps;
    cout << endl;
 
    double x = xMin;
    for (;fabs(x)<xMax;x+=xStep){
        ctrl = log((1+x)/(1-x));
        sum = 0;
        n = 0;
        currentAdd = addCalc(x, n);
        sum += currentAdd;
        n++;
        do{
            previousAdd = currentAdd;
            currentAdd = addCalc(x, n);
            sum += currentAdd;
            n++;
        }
        while(fabs((currentAdd-previousAdd) / currentAdd) > eps);
 
        cout << "| x: " << x;
        cout.precision(10);
        cout.setf(ios::fixed);
        cout << " | sum: " << sum;
        cout << " | Amount of addends: " << n+1;
        cout.precision(10);
        cout.setf(ios::fixed);
        cout << " | Control value: " << ctrl;
        cout << " | Diff(ctrl&sum): " << ctrl-sum << " |\n";
        cout.unsetf(ios::fixed);
    }
 
    cout << "Do one more time? y/n: ";
    char a;
    cin >> a;
    if (a=='y') {/*system("cls");*/main();}
 
    return 0;
}
0
543 / 486 / 104
Регистрация: 05.05.2014
Сообщений: 1,110
12.02.2016, 00:50
Цитата Сообщение от inviter42 Посмотреть сообщение
с точки зрения математического вычисления.
Насколько я знаю (возможно, ошибаюсь) не существует для знакопостоянных рядов какого-то признаки точности вычислений на основе уже вычисленных членов. Тут действительно придется обратиться к матанализу и искать оценку остаточному члену (в форме Лагранжа или еще какой) именно для конкретной функции.
Для уточнений советую обратиться в раздел "Математика - Матанализ"
1
 Аватар для inviter42
83 / 2 / 2
Регистрация: 27.11.2015
Сообщений: 163
12.02.2016, 00:59  [ТС]
8-BITOV, я смотрел тут. Они там вычисляют экспоненту через разложение в знакопостоянный ряд. И делают оценку через отличие текущего сумманда и точности. Или это не то?

Добавлено через 7 минут
Однако, моя попытка сделать так же не привела к положительному результату. Не исключаю, что я где-то ошибся, но всё, вроде как, правильно.
Моя попытка:
Код
C++
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 <iostream>
#include <cmath>
 
using namespace std;
 
double Current(double x, int n){
    return 2*(pow(x,2*n+1)/(2*n+1));
}
 
int main(){
 
    double x, xStep, eps, sum, currentAdd, control;
    int n;
    cout << "Enter x: ";
    cin >> x;
 
    cout << "Enter x step: ";
    cin >> xStep;
 
    cout << "Enter eps: ";
    cin >> eps;
 
    for(;x<1;x+=xStep){
        n=0;
        sum=0;
        control = log((1+x)/(1-x));
        sum = currentAdd = Current(x,n);
        while(currentAdd>eps){
            n++;
            sum += currentAdd = Current(x,n);
        }
        cout << "Control: " << control << endl;
        cout << "Sum: " << sum << endl << endl;
    }
 
    return 0;
}
0
543 / 486 / 104
Регистрация: 05.05.2014
Сообщений: 1,110
12.02.2016, 01:02
Цитата Сообщение от inviter42 Посмотреть сообщение
И делают оценку через отличие текущего сумманда и точности
Посмотрел. Детские забавы. Ерунда, одним словом. Да, для экспоненты все хорошо. Так как у нее остаточный член легко оценить, и он меньше первого отброшенного члена. Но об этом ни слова! Да и правда, рассуждения на эту тему на порядок сложнее, чем весь излагаемый там материал.
Да, многие ряды элементарных функций ведут себя в этом смысле хорошо. Но обобщать это поведение мы не имеем права. Логарифм (как очень медленно сходящаяся функция) - накажет.
1
 Аватар для inviter42
83 / 2 / 2
Регистрация: 27.11.2015
Сообщений: 163
12.02.2016, 01:03  [ТС]
8-BITOV, значит оценивать только через форму Лагранжа, я правильно понимаю?
0
543 / 486 / 104
Регистрация: 05.05.2014
Сообщений: 1,110
12.02.2016, 01:06
Цитата Сообщение от inviter42 Посмотреть сообщение
Моя попытка:
К коду претензий нет. Но теоретически - он неверен. Смотри выше.

Добавлено через 1 минуту
Цитата Сообщение от inviter42 Посмотреть сообщение
оценивать только через форму Лагранжа, я правильно понимаю?
Я другого выхода не вижу (но это вовсе не значит, что его нет)
0
 Аватар для inviter42
83 / 2 / 2
Регистрация: 27.11.2015
Сообщений: 163
12.02.2016, 01:08  [ТС]
8-BITOV, а вы могли бы набросать код с оценкой через форму Лагранжа, если не сложно? Хотя бы в общей форме. Помогли бы очень сильно
0
543 / 486 / 104
Регистрация: 05.05.2014
Сообщений: 1,110
12.02.2016, 01:16
Цитата Сообщение от inviter42 Посмотреть сообщение
вы могли бы набросать код с оценкой через форму Лагранжа, если не сложно
Отвечу сразу, чтобы вас не обнадеживать. Нет. Кодирование таких вещей не входит сегодня в круг моих интересов. Да и все эти остаточные члены я уже не помню. Просто остатки когда-то полученного образования говорят, что они - есть.
Но я надеюсь, вы справитесь сами. Постановка вопроса - грамотная. Коды - вполне приличные.
Удачи!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.02.2016, 01:16
Помогаю со студенческими работами здесь

Вычислить значение суммы членов бесконечного ряда с заданной точностью E
Вычислить значение суммы членов бесконечного ряда с заданной точностью E. На печать вывести значение суммы и число членов ряда, вошедших...

Вычислить с заданной точностью значение функции, представленной в виде суммы бесконечного ряда
Всем привет. Я делаю лабу по программированию,но у меня не выходит,так как я только начинаю знакомиться с языком С++.Помогите...

Вычислить с заданной точностью приближенное значение бесконечной суммы
4)Дано действительные числа x, ε (ε&gt;0). Вычислить с заданной точностью ε приближенное значение бесконечной суммы и сравнить его с точным. ...

Вычислить значение функции, используя суммы с точностью.заданной пользователем
Нужно посчитать значение функции y=(e^x )* sin(x),не пользуясь функциями экспоненты и синуса,а раскладывая в суммы.И посчитать это значение...

Вычислить значение суммы ряда с заданной точностью
вообщем есть задание как я понял тут надо использовать циклы..... но как и что я так и не нашёл. мб кто нибудь поможет литературой/устно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru