Вычислить бесконечную сумму с заданной точностью C++
Всем привет, при решении задачи возникли трудности: не могу понять где допущена ошибка. Помогите пожалуйста ее исправить. И правильно ли я ее решаю?
Задание:
Вычислить бесконечную сумму S с точностью ε.
Считать, что требуемая точность достигнута, если значение
очередного слагаемого по модулю меньше заданного ε (это и все
последующие слагаемые можно не учитывать). Определить и вывести
количество слагаемых найденной суммы, учтенных при расчете.
Значение суммы выводить с точностью до 8 знаков в дробной части.
Если ни один из слагаемых не был учтен, то выдать об этом сообщение.
Внимание! Для нахождения степени числа не использовать
стандартных функций, а вычислять его самостоятельно с помощью
оператора цикла. Для вычисления факториала числа применить цикл for.
Ограничения: x, ε – действительные числа (x ≠ 0, ε > 0),
? – целое число ( |?| < 106).
По формуле:

Мое решение(основные ф-и):
double factorial(int n) { // Функция для вычисления факториала числа
double fact = 1;
for (int i = 1; i <= n; i++) {
fact *= i;
}
return fact;
}
double valueA(int k) {
if (k % 2 == 0) {
return -1; // Для четных k
}
else {
return factorial(k); // Для нечетных k
}
}
// Функция для вычисления бесконечной суммы
double infinite_sum(double x, double e, int a) {
double sum = 0;
double term;
int k = 1;
do {
term = sin(k * x) / k * valueA(a);
sum += term;
k++;
} while (abs(term) >= e);
if (k == 1) {
cout << "Ни одно из слагаемых не было учтено.";
return 0;
}
else {
cout << endl;
cout << "Сумма равна " << fixed << setprecision(8) << sum << endl; // устанавливаем точность вывода до 8 знаков после запятой
cout << endl;
cout << "Количество учтенных слагаемых равно " << k - 1 << endl;
return sum;
}
}
Ответы (1 шт):
#include <math.h>
#include <clocale>
#include <iomanip>
#include <iostream>
double fact(int n) {
double res = 1;
for (int i = 2; i <= n; ++i)
res *= i;
return res;
}
void infinite_sum(double x, double e, int a, int& k, double& sum) {
k = 1;
sum = 0;
double x_k = x, b = fact(a);
double val = b * std::sin(x);
while((val > 0? val : -val) >= e) {
sum += val;
val = std::sin(x_k += x) / ++k;
val = k & 1? b * val : -val;
}
--k;
}
double get_a_k(double x, double b, int k) {
double res = std::sin(k * x) / k;
res = k & 1? b * res : -res;
return res;
}
int main()
{
std::setlocale(LC_ALL, "rus");
const int N = 6;
const double X = 0.5, E = 0.001;
int k;
double sum;
(void) infinite_sum(X, E, N, k, sum);
if(!k)
std::cout << "Ни одно из слагаемых не было учтено.";
else {
std::cout << "Сумма: " << std::fixed << std::setprecision(8) << sum << '\n';
std::cout << "Количество учтенных cлагаемых: " << k << '\n';
++k;
double val, nsum = 0, b = fact(N);
for(int i = 1; i <= k; ++i) {
std::cout << "a(" << i << ") = " << (val = get_a_k(X, b, i)) << "; ";
std::cout << "s(" << i << ") = " << (nsum += val) << ";\n";
}
}
return 0;
}
Результат:
Сумма: 581.93557436
Количество учтенных cлагаемых: 43
a(1) = 345.18638780; s(1) = 345.18638780;
a(2) = -0.42073549; s(2) = 344.76565230;
a(3) = 239.39879678; s(3) = 584.16444909;
a(4) = -0.22732436; s(4) = 583.93712473;
a(5) = 86.17998875; s(5) = 670.11711348;
a(6) = -0.02352000; s(6) = 670.09359348;
a(7) = -36.08056056; s(7) = 634.01303292;
a(8) = 0.09460031; s(8) = 634.10763323;
a(9) = -78.20240941; s(9) = 555.90522382;
a(10) = 0.09589243; s(10) = 556.00111624;
a(11) = -46.18082131; s(11) = 509.82029493;
a(12) = 0.02328462; s(12) = 509.84357956;
a(13) = 11.91433780; s(13) = 521.75791736;
a(14) = -0.04692761; s(14) = 521.71098975;
a(15) = 45.02399889; s(15) = 566.73498863;
a(16) = -0.06183489; s(16) = 566.67315374;
a(17) = 33.81827771; s(17) = 600.49143145;
a(18) = -0.02289547; s(18) = 600.46853598;
a(19) = -2.84783193; s(19) = 597.62070405;
a(20) = 0.02720106; s(20) = 597.64790510;
a(21) = -30.16099748; s(21) = 567.48690762;
a(22) = 0.04545410; s(22) = 567.53236172;
a(23) = -27.40545938; s(23) = 540.12690234;
a(24) = 0.02235720; s(24) = 540.14925954;
a(25) = -1.91007064; s(25) = 538.23918890;
a(26) = -0.01616027; s(26) = 538.22302863;
a(27) = 21.43425137; s(27) = 559.65728000;
a(28) = -0.03537883; s(28) = 559.62190117;
a(29) = 23.21118759; s(29) = 582.83308875;
a(30) = -0.02167626; s(30) = 582.81141249;
a(31) = 4.79537377; s(31) = 587.60678627;
a(32) = 0.00899698; s(32) = 587.61578325;
a(33) = -15.52986202; s(33) = 572.08592123;
a(34) = 0.02827640; s(34) = 572.11419763;
a(35) = -20.07002068; s(35) = 552.04417694;
a(36) = 0.02086076; s(36) = 552.06503770;
a(37) = -6.66448771; s(37) = 545.40054999;
a(38) = -0.00394414; s(38) = 545.39660585;
a(39) = 11.17919759; s(39) = 556.57580345;
a(40) = -0.02282363; s(40) = 556.55297982;
a(41) = 17.50530370; s(41) = 574.05828352;
a(42) = -0.01992037; s(42) = 574.03836315;
a(43) = 7.89721121; s(43) = 581.93557436;
a(44) = 0.00020117; s(44) = 581.93577553;
Вычисления с mathforyou.net/online/calculus/series/sum
S(1) = 720*sin(0.5) = 345,18638779


Итого: S = S(1) + S(2, 43) = 345.18638779 + 236.74918656 = 581,93557435