C/C++

Циклы, использующие рекуррентные соотношения C++

Проверьте, пожалуйста, мое решение. Использовал два рекуррентных множителя p и a, p= -p * x*x/(k+1), a=1/pow(2,k)

Задание: При заданном х с точностью eps вычислить сумму.




#include <iostream>
#include <math.h>

using namespace std;

int main()
{
double p, x, s, eps;
int k;
cout<< "Enter x: ";
cin>> x;
cout<< "Enter eps: ";
cin>> eps;
s=0;
p=1;
for (k=0; fabs(1/pow(2,k))>=eps; k++)
{

s = s + 1/pow(2,k)* p;
p = -p * x * x / (k + 1);

}
cout<< "Сумма = " << s;
}
Здрасьте! Ваше решение выглядит правильным и соответствует заданию. Оно использует два рекуррентных множителя p и a, где p = -p * x * x / (k + 1) и a = 1 / pow(2, k). В цикле вы используете условие fabs(1 / pow(2, k)) >= eps для проверки точности. Если данное условие выполняется, то происходит вычисление суммы и обновление значений p и k. Однако, есть небольшое замечание к вашему коду. Использование using namespace std не рекомендуется внутри глобальной области видимости в C++. Вместо этого рекомендуется явно указывать префикс std:: перед использованием стандартных библиотечных функций и классов, например, std::cout, std::cin, std::fabs, и т.д.

Я правил код и вот что получилось:
 #include  
#include

int main()
{
double p, x, s, eps;
int k;

std::cout > x;

std::cout > eps;

s = 0;
p = 1;

for (k = 0; std::fabs(1 / std::pow(2, k)) >= eps; k++)
{
s = s + 1 / std::pow(2, k) * p;
p = -p * x * x / (k + 1);
}

std::cout
Denis Shirokov
Denis Shirokov
2 867
Лучший ответ
Сабирянов Раис Спасибо за ваш ответ! Скажите, пожалуйста, а почему именно не рекомендуется использовать namespace std, просто нас в универе так учат делать, я думал так правильнее?
Два соотношения не требуются:
 q = -x * x / 2

а[0] = 1
a[k] = a[k - 1] * q * k / (k + 1)
Впрочем, два соотношения упрощают код:
 q = -x * x / 2 

t[0] = 1
t[k] = t[k - 1] * q

a[k] = t[k] / (k + 1)
Код:
 double x, eps;
cin >> x >> eps;
double s = 1.0, t = 1.0, q = -x * x / 2.0, a;
long k = 1;
do {
++k;
t *= q;
a = t / k;
s += a;
} while(abs(a) >= eps);
cout = eps);
Алексей Иванов Кстати, если там действительно факториал, то всё ещё проще:
 q = -x * x / 2

а[0] = 1
a[k] = a[k - 1] * q * / k
И цикл:
 double s = 1.0, a = 1.0, q = -x * x / 2.0;
long k = 0;
do {
++k;
a *= q / k;
s += a;
} while(abs(a) >= eps);
Укороченный вариант:
 do { s += (a *= q / ++k); } while(abs(a) >= eps); 
А это у Вас что вообще такое?Если бы надо было вычислить сумму ряда
Σ(n=0;∞)(-1)ⁿx²ⁿ/(2ⁿ•n!), то это, во первых,
exp(-x²/2), а раз так, то и вычислять проще всего сумму этого ряда через библиотечную функцию. Но можно использовать её и для контроля вычислений. А вообще лучше всего так:
 #include  
#include
#include

using namespace std;

double f(double x)
{
return exp(-0.5 * x * x);
}

double s(double x, double eps)
{
double y = -0.5 * x * x, p = 1., s = p, q = 0.;
while (fabs(p) > eps)
{
q += 1.;
p *= y / q;
s += p;
}
return s;
}

int main()
{
double eps, x, y;
while (true)
{
cout > x >> eps;
y = s(x, eps);
cout
Erlan Myxametkan
Erlan Myxametkan
66 572
Сабирянов Раис Действительно в формуле ошибка, спасибо, что заметили. Исправляю!
Erlan Myxametkan И хотя при |х|≤3 всё ещё более-менее правильно, но всё равно лучше сразу избавиться от знакопеременности:
 #include  
#include
#include
using namespace std;
double f(double x) { return exp(-0.5 * x * x); }
double s(double x, double eps)
{ double y = 0.5 * x * x, p = 1., s = p, q = 0.;
while (fabs(p) > eps) { q += 1.; p *= y / q;
s += p; } return 1. / s; }
int main()
{ double eps, fx, x, y; while (true)
{ cout > x >> eps;
if (eps < 0) break; y = s(x, eps); fx = f(x);
cout