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

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

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

Подскажите как будет выглядеть условие по которому будет выполнятся цикл(с математикой я не дружу)
вернее данные для условия?
 
F
#2
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;
}
цикл бесконечный
 
B

Barmaglot

#3
А вы уверены, что именно x^((2n-1)/(2n+1)), а не (x^(2n-1))/2n+1?
 

hosm

* so what *
18.05.2009
2 442
6
#5
а зачем x взято 0?
просто для 0 там должно выйти из цикла на первой же итерации.
А дальше смотря какой х введете. может быть так, что ряд вообще не сходится)
 
B

Barmaglot

#7
При n->бесконечности данная функция стремится к x.(Можете построить в маткаде и убедиться)
Так что скорей всего там (2n+1) стоит не под степенью, а в знаменателе. Тогда ряд сойдется.
 
F
#8
нет там точно 100% х в степени 2n-1
если x<1 ряд сойдётся
 
F
#9
#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;
}
вот еще наработки но тоже безуспешные
 

hosm

* so what *
18.05.2009
2 442
6
#10
первій вариант был правильней. Разве модуль суммы ряда должен быть <0.003 для любого x?
 

hosm

* so what *
18.05.2009
2 442
6
#11
вернитесь к 1му варианту, выводите part на каждой итерации и ограничьте число итераций, например, для начала, 500 или 1000.
если за это время нет уменьшения абсолютной величины part, выходите из цикла... пишите, что невозможно вычислить с заданной точностью.
вот расжевана хорошо теория, смотрите 5. Пример решения задачи
Кстати, обратите внимание на подход к вычислению степеней (-1)...
 
F
#12
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

#13
Ну дк. У вас и ряд то теперь совсем другой. :sorry:
 
F
#14
Почему ряд другой?

Добавлено: По другому записал просто.
 
B

Barmaglot

#15
Потому что теперь (2n+1) явно не стоит в знаменателе степени(Вы просто на него делите)==то, что я предлагал сделать с самого начала.)
 
F
#17
Код:
														 #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;
}
Программа работает, преподавателя не устраивает вид записи функции, нужно переделать, а как не пойму мои варианты ее не устраивают. Подскажите как грамотно записать, используя функцию, вычисление суммы ряда.