Форум программистов, компьютерный форум CyberForum.ru

Решение суммы ряда - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.75
Zverit
Уничтожитель печенек
 Аватар для Zverit
277 / 205 / 21
Регистрация: 07.02.2010
Сообщений: 723
21.07.2011, 12:47     Решение суммы ряда #1
Не раз видел задачки типа "Дано вещественное число Х и целое число N (>0).Найти значение выражения 1-х^2/(2!)+x^4/(4!)-...+(-1)^n*X^(2*n)/((2*N)!)
(N!=1*2*...*N). ... "
, не понимал и откладывал в "дальний угол". Т.в. прошу, объясните подробно, как их решать? На что смотреть в первую очередь? Как я понимаю формула строится по последней части (...+(-1)^n*X^(2*n)/((2*N)!)), скорее всего я не прав. Знаю, что решается через цикл. Но вот построение формулы как-то не понятна.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2011, 12:47     Решение суммы ряда
Посмотрите здесь:

C++ суммы ряда
C++ Составить программу для вычисления суммы данного ряда для указанного значения аргумента х, если известно количество N членов ряда.
Составить программу для вычисления суммы данного ряда для указанного значения аргумента х, если известно количество N членов ряда. C++
C++ Составить программу для вычисления суммы данного ряда для указанного значения аргумента х, если известно количество N членов ряда.
Суммы ряда C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
21.07.2011, 13:20     Решение суммы ряда #2
Обычно в таких формулах каждый следующий член можно получать рекуррентно из предыдущего.
Например в данном случае если последний член разделить на предпоследний, то получается множитель, на который надо умножать каждый член, чтобы получить следующий
http://www.cyberforum.ru/cgi-bin/latex.cgi?{(-1)^i x^{2i}\over (2i)!} {\cdot} {(2i-2)!\over (-1)^{i-1} x^{2i-2}} = -{x^2\over 2i(2i-1)}
осталось задать начальный член и организовать цикл (в данном случае можно только по чётным элементам)

Добавлено через 7 минут
То есть очередной член ряда из предыдущего получается так:
http://www.cyberforum.ru/cgi-bin/latex.cgi?T_i = -{x^2\over 2i(2i-1)}\cdot T_{i-1}
Zverit
Уничтожитель печенек
 Аватар для Zverit
277 / 205 / 21
Регистрация: 07.02.2010
Сообщений: 723
21.07.2011, 13:22  [ТС]     Решение суммы ряда #3
grizlik78, благодарю, почти понял. Еще для полного усвоения не помешало бы привести пример в коде, желательно с комментариями.
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
21.07.2011, 13:27     Решение суммы ряда #4
Если не ошибаюсь, то данная формула, это разложение косинуса
bigar
 Аватар для bigar
53 / 53 / 23
Регистрация: 18.02.2011
Сообщений: 146
21.07.2011, 13:34     Решение суммы ряда #5
Можно так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include "stdafx.h"
#include <math.h>
#include <iostream>
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"rus");
    const double e=0.0001;
    double s;
    double u1;
    double u2;
    double x;
    int n;
           s=0;u1=1;n=1;
             int i=1;
             while(i<=n) 
         {   
          s+=u1;
              u2=(-u1*x*x)/((n+2)*(n+1));
                  if(fabs(u1-u2)<e)break;
                 u1=u2;
                n++;
         } 
         std::cout<<"Сумма ряда "<<std::endl;
            std::cout<<"S="<<s<<std::endl;
         system("pause");  
      return 0;
}
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
21.07.2011, 13:37     Решение суммы ряда #6
bigar, что-то ты тут намудрил с i и n
Zverit
Уничтожитель печенек
 Аватар для Zverit
277 / 205 / 21
Регистрация: 07.02.2010
Сообщений: 723
21.07.2011, 13:39  [ТС]     Решение суммы ряда #7
grizlik78, bigar, А комментарии можно к программам?
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
21.07.2011, 13:48     Решение суммы ряда #8
Ну а что там комментировать-то?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
 
int main()
{
    int N = 2*20; /* число членов ряда (удвоенное из-за замены переменной) */
    double x   =  0.5, /* значение x, можно ввести с консоли */
           mx2 = -x*x; /* минус икс квадрат, чтобы не вычислять 10 раз*/
 
    int i;
    double part = 1, /* первый (нулевой) член ряда */
           sum = 1; /* начальная сумма (из одного члена) */
    /* Цикл по заданному количеству членов.
      Можно организовать до достижения заданной погрешности */
    for (i = 2; i < N; i+=2) {
        /* вычисляем следующий член умножением на знаменатель ряда */
        part *= mx2/((i-1)*i);
        sum += part; /* прибавляем его к сумме */
    }
    printf("cos(%lf) = %lf\n", x, sum); /* результат */
    
    return 0;
}
bigar
 Аватар для bigar
53 / 53 / 23
Регистрация: 18.02.2011
Сообщений: 146
21.07.2011, 13:57     Решение суммы ряда #9
Цитата Сообщение от grizlik78 Посмотреть сообщение
bigar, что-то ты тут намудрил с i и n
все норм
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <math.h>
#include <iostream>
 
int main()
{
        setlocale(LC_ALL,"rus");
        const double e=0.0001;
        double s;
        double u1;
        double u2;
        double x;
        int n;
        std::cout << "Введите x -> ";
        std::cin >> x;//вверху все понятно
               s=0;u1=1;n=1;// значение суммы сразу в 0, 1 член ряда 1 и n=1 
                 int i=1;
                 while(i<=n) //в цикле считаем сумму пока разность предыдущего и последующего членов    не будет больше погрешности
             {   
                  s+=u1;считаем сумму
                  u2=(-u1*x*x)/((n+2)*(n+1));//с помощью рекурентной формулы вычисляем следующий член
                  if(fabs(u1-u2)<e)break;
                     u1=u2;//если разность не больше идем в цикле дальше  и считаем сумму предыдущему присваиваем последующий
                        n++;
             } 
             std::cout<<"Сумма ряда "<<std::endl;
            std::cout<<"S="<<s<<std::endl;
             system("pause");  
          return 0;
}
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
21.07.2011, 14:01     Решение суммы ряда #10
Цитата Сообщение от bigar Посмотреть сообщение
все норм
Да не, программа-то, наверное, работает, но условие цикла
C++
1
while(i<=n)
станет ложным лишь если произойдёт переполнение в n.
Ведь в цикле i не меняется и не используется (что уже само по себе странно выглядит), а n только растёт
bigar
 Аватар для bigar
53 / 53 / 23
Регистрация: 18.02.2011
Сообщений: 146
21.07.2011, 14:07     Решение суммы ряда #11
i не должно расти
цикл прекратится когда выполнится условие
C++
1
  if(fabs(u1-u2)<e)break;
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
21.07.2011, 14:09     Решение суммы ряда #12
Это я понимаю. Я говорил только про i и n. Зачем здесь вообще i?
bigar
 Аватар для bigar
53 / 53 / 23
Регистрация: 18.02.2011
Сообщений: 146
21.07.2011, 14:13     Решение суммы ряда #13
Цитата Сообщение от grizlik78 Посмотреть сообщение
Это я понимаю. Я говорил только про i и n. Зачем здесь вообще i?
ну если вас что то смущает то
C++
1
2
3
4
5
6
7
8
9
s=0;n=1;u2=1;
do 
{   
u1=u2;
s+=u2;
u2=-u1*x*x/((N+2)*(n+1));
n++;
}
while(fabs(u1-u2)>=e);
так будет понятней и правильней. Разницы никакой
Zverit
Уничтожитель печенек
 Аватар для Zverit
277 / 205 / 21
Регистрация: 07.02.2010
Сообщений: 723
22.07.2011, 11:49  [ТС]     Решение суммы ряда #14
А как проверить, правильно вычисляет или нет?

Добавлено через 16 минут
Цитата Сообщение от grizlik78 Посмотреть сообщение
Ну а что там комментировать-то?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
 
int main()
{
    int N = 2*20; /* число членов ряда (удвоенное из-за замены переменной) */
    double x   =  0.5, /* значение x, можно ввести с консоли */
           mx2 = -x*x; /* минус икс квадрат, чтобы не вычислять 10 раз*/
 
    int i;
    double part = 1, /* первый (нулевой) член ряда */
           sum = 1; /* начальная сумма (из одного члена) */
    /* Цикл по заданному количеству членов.
      Можно организовать до достижения заданной погрешности */
    for (i = 2; i < N; i+=2) {
        /* вычисляем следующий член умножением на знаменатель ряда */
        part *= mx2/((i-1)*i);
        sum += part; /* прибавляем его к сумме */
    }
    printf("cos(%lf) = %lf\n", x, sum); /* результат */
    
    return 0;
}
Хм. А тут постоянно выводит результат 0.5 при любом значении N
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
22.07.2011, 11:52     Решение суммы ряда #15
Цитата Сообщение от ITZver Посмотреть сообщение
А как проверить, правильно вычисляет или нет?
ну дык посчитай косинус 0.5 на калькуляторе
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
22.07.2011, 11:56     Решение суммы ряда #16
Цитата Сообщение от ITZver Посмотреть сообщение
Хм. А тут постоянно выводит результат 0.5 при любом значении N
Вообще-то выводится 2 числа:
Код
$ ./a.out 
cos(0.500000) = 0.877583
То, что справа от равно, это результат.
А то что слева, это формула, которой можно проверить.
Ряд довольно быстро сходится для небольших x, так что заметная разница будет только при маленьких N
Zverit
Уничтожитель печенек
 Аватар для Zverit
277 / 205 / 21
Регистрация: 07.02.2010
Сообщений: 723
22.07.2011, 21:33  [ТС]     Решение суммы ряда #17
Цитата Сообщение от Maxwe11 Посмотреть сообщение
ну дык посчитай косинус 0.5 на калькуляторе
Результат: 0.9

Добавлено через 4 минуты
grizlik78, спасибо. Я немного подтупливаю, т.к. наверное, всему свое время и не нужно лезть в высшую математику(хотя,блин, интересно )

Добавлено через 9 часов 32 минуты
Проверьте, правильно ли я решил?
Задание:
Дано вещественное число X (|X| < 1) и целое число N (> 0). Найти
значение выражения X - X^3/3 + X^5/5 - ... + (-1)N*X^2*N+1/(2*N+1).
Полученное число является приближенным значением функции arctg в
точке X
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <cmath>
#include <iostream>
 
int main(int argc, char *argv[])
{
    int N;
    double s,a,x;
    std::cin>>x;
    if ((x<1)&&(x > 0))
    {
      std::cin>>N;
      if (N>0)
      {
      s = 0; 
      a = 1;
       for (int i = 1; i <=N; i++ )
       {
        a = - a * x;
        s = s + a / 2 * i + 1;  
       }    
       std::cout<< atan(x)<<std::endl;
       std::cout<<s<<std::endl;
    }
}
    system("PAUSE>>null");
    return 0;
}
Миниатюры
Решение суммы ряда  
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
22.07.2011, 21:53     Решение суммы ряда #18
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <cmath>
#include <iomanip>
#include <iostream>
 
int main()
{
    std::cout << "Enter X: ";
    double x;
    std::cin >> x;
    if (abs(x) < 1.0)
    {
        std::cout << "Enter N: ";
        int N;
        std::cin >> N;
        if (N > 0)
        {
            double part = x, total_sum = x;
            for (int i = 1; i <= N; ++i)
            {
                part *= - x * x * (2 * (i - 1) + 1) / (2 * i + 1);
                total_sum += part;
            }    
            std::cout << "atan(" << x << ") = " << std::setprecision(16) << atan(x) << std::endl
                      << "Aproximate = " << std::setprecision(16) << total_sum << std::endl;
        }
    }
    system("pause");
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2011, 23:09     Решение суммы ряда
Еще ссылки по теме:

C++ определить число членов ряда, необходимых для расчета с заданной погрешностью суммы членов ряда:
Вычисление суммы ряда С++ C++
C++ Вычисление суммы ряда C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
22.07.2011, 23:09     Решение суммы ряда #19
ITZver, ну, в общем нечто похожее есть. Но не видать квадрата, неправильно инициализирована сумма и первый член. И скобки в знаменателе потерялись.
У Maxwe11 верно, но рекррентное вычисление всего слагаемого ни к чему, достаточно вычислять рекуррентно числитель, а знаменатель напрямую.
В общем мой вариант.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <iomanip>
#include <cmath>
 
int main(int argc, char *argv[])
{
    double x;
    std::cin >> x;
    if (fabs(x < 1))
    {
        int N;
        std::cin >> N;
        if (N > 0)
        {
            double sum = x; 
            double num = x;
            double mx2 = -x*x;
            for (int i = 3; i <= 2*N + 1; i += 2 )
            {
                num *= mx2;
                sum += num / i;  
            }    
            std::cout << std::setprecision(16) << atan(x) << std::endl;
            std::cout << std::setprecision(16) << sum << std::endl;
        }
    }
    return 0;
}
Yandex
Объявления
22.07.2011, 23:09     Решение суммы ряда
Ответ Создать тему

Метки
сумма ряда
Опции темы

Текущее время: 11:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru