• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

вычисление суммы раяда

  • Автор темы fed
  • Дата начала
F

fed

Написать функцию вычисления суммы ряда s=s(1)+…+s(n),

где s(n)=(-1)n x^(2n-1)/(2n+1) с точностью до eps=0.001. В качестве параметров выбрать x и eps.

Подскажите как будет выглядеть условие по которому будет выполнятся цикл(с математикой я не дружу)
вернее данные для условия?
 
F

fed

s(n)=(-1)^n x^(2n-1)/(2n+1)
C++:
eсть такой код но тут что то не так
#include <iostream>
#include <math.h>
using namespace std;

int main()
{
double x = 0.0, part = 0.002, sum = 0.0;
cin >> x;

for (int n = 1; abs(part) > 0.001; n++)
{
part = pow(-1.0, (double)n) * pow(x, (2.0*(double)n - 1.0) / (2.0*(double)n + 1.0));
sum = sum + part;
}
cout << endl << sum;
return 0;
}
цикл бесконечный
 
H

hosm

а зачем x взято 0?
просто для 0 там должно выйти из цикла на первой же итерации.
А дальше смотря какой х введете. может быть так, что ряд вообще не сходится)
 
B

Barmaglot

При n->бесконечности данная функция стремится к x.(Можете построить в маткаде и убедиться)
Так что скорей всего там (2n+1) стоит не под степенью, а в знаменателе. Тогда ряд сойдется.
 
F

fed

#include <stdio.h> #include <stdio.h>
#include <math.h>
#include <conio.h>
double ABS(double s)
{return s<0 ? s*-1:s;
}
int main()
{
double x=0.0f, s=0.002f;
scanf("%f",&x);
for (int n=1; ABS(s)<0.003; n++)
s+=pow(-1.0, (double)n)*pow(x,(2.0*(double)n-1.0)/(2.0*(double)n+1.0));
printf("s=",s);
getch ();
return 0;
}
вот еще наработки но тоже безуспешные
 
H

hosm

первій вариант был правильней. Разве модуль суммы ряда должен быть <0.003 для любого x?
 
H

hosm

вернитесь к 1му варианту, выводите part на каждой итерации и ограничьте число итераций, например, для начала, 500 или 1000.
если за это время нет уменьшения абсолютной величины part, выходите из цикла... пишите, что невозможно вычислить с заданной точностью.
вот расжевана хорошо теория, смотрите
Кстати, обратите внимание на подход к вычислению степеней (-1)...
 
F

fed

C++:
#include <stdio.h>															
#include <math.h>
#include <conio.h>
int main()
{
int sign, n;
double eps, sum, elem, x;
eps=0.001;
x=0.1;
sign=1;
for(n=1; n++;)
{
elem=sign*pow(x,(2n-1))/(2*n+1);
sum+=elem;
if(fabs(elem)<eps){break;}
sign=-sign;
}
printf("sum=%.10f\n",sum);
getch();
return 0;
}
вот так работает. но не знаю правильно или нет
 
B

Barmaglot

Потому что теперь (2n+1) явно не стоит в знаменателе степени(Вы просто на него делите)==то, что я предлагал сделать с самого начала.)
 
F

fed

Код:
														 #include <stdio.h>
#include <math.h>
#include <conio.h>
double fabs(double sum)
{return sum<0 ? -sum:sum;}
int main()
{
clrscr();
int sign, n;
double eps, sum, elem, x;
eps=0.001;
x=0.5;
sign=1;
for(n=1; n++;)
{
elem=sign*pow(x,(2*n-1))/(2*n+1);
sum+=elem;
if(fabs(elem)<eps){break;}
sign=-sign;
}
printf("sum=%.10f\n",sum);
getch();
return 0;
}
Программа работает, преподавателя не устраивает вид записи функции, нужно переделать, а как не пойму мои варианты ее не устраивают. Подскажите как грамотно записать, используя функцию, вычисление суммы ряда.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!