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

Тема в разделе "C/C++/C#", создана пользователем fed, 15 апр 2010.

  1. fed

    fed Гость

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

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

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

    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;
    }
    цикл бесконечный
     
  3. Barmaglot

    Barmaglot Гость

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

    fed Гость

    -1в степени n.
    х в степени(2N-1)деленное на 2n+1
     
  5. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    а зачем x взято 0?
    просто для 0 там должно выйти из цикла на первой же итерации.
    А дальше смотря какой х введете. может быть так, что ряд вообще не сходится)
     
  6. fed

    fed Гость

    может х <=1? попробовать
     
  7. Barmaglot

    Barmaglot Гость

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

    fed Гость

    нет там точно 100% х в степени 2n-1
    если x<1 ряд сойдётся
     
  9. fed

    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;
    }
    вот еще наработки но тоже безуспешные
     
  10. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    первій вариант был правильней. Разве модуль суммы ряда должен быть <0.003 для любого x?
     
  11. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    вернитесь к 1му варианту, выводите part на каждой итерации и ограничьте число итераций, например, для начала, 500 или 1000.
    если за это время нет уменьшения абсолютной величины part, выходите из цикла... пишите, что невозможно вычислить с заданной точностью.
    вот расжевана хорошо теория, смотрите 5. Пример решения задачи
    Кстати, обратите внимание на подход к вычислению степеней (-1)...
     
  12. fed

    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;
    }
    вот так работает. но не знаю правильно или нет
     
  13. Barmaglot

    Barmaglot Гость

    Ну дк. У вас и ряд то теперь совсем другой. :sorry:
     
  14. fed

    fed Гость

    Почему ряд другой?

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

    Barmaglot Гость

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

    fed Гость

    подправил
     
  17. fed

    fed Гость

    Код (Text):
                                                             #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;
    }
    Программа работает, преподавателя не устраивает вид записи функции, нужно переделать, а как не пойму мои варианты ее не устраивают. Подскажите как грамотно записать, используя функцию, вычисление суммы ряда.
     
Загрузка...
Похожие Темы - вычисление суммы раяда
  1. Tipo4ek
    Ответов:
    1
    Просмотров:
    1.056
  2. Extrem
    Ответов:
    4
    Просмотров:
    1.273
  3. ballack
    Ответов:
    0
    Просмотров:
    1.108
  4. Gelergo
    Ответов:
    1
    Просмотров:
    1.765
  5. VladSh
    Ответов:
    27
    Просмотров:
    8.768

Поделиться этой страницей