Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.75
Zverit
Уничтожитель печенек
277 / 205 / 21
Регистрация: 07.02.2010
Сообщений: 723
#1

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

21.07.2011, 12:47. Просмотров 1977. Ответов 18

Не раз видел задачки типа "Дано вещественное число Х и целое число 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)!)), скорее всего я не прав. Знаю, что решается через цикл. Но вот построение формулы как-то не понятна.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2011, 12:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Решение суммы ряда (C++):

определить число членов ряда, необходимых для расчета с заданной погрешностью суммы членов ряда: - C++
определить число членов ряда, необходимых для расчета с заданной погрешностью суммы членов ряда: 1-1/3+1/5-1/7+…..: (-1)^N/(2*N+1);...

Составить программу для вычисления суммы данного ряда для указанного значения аргумента х, если известно количество N членов ряда. - C++
Составить программу для вычисления суммы данного ряда для указанного значения аргумента х, если известно количество N членов ряда. ...

Составить программу для вычисления суммы данного ряда для указанного значения аргумента х, если известно количество N членов ряда. - C++
Составить программу для вычисления суммы данного ряда для указанного значения аргумента х, если известно количество N членов ряда. ...

Составить программу для вычисления суммы данного ряда для указанного значения аргумента х, если известно количество N членов ряда. - C++
Составить программу для вычисления суммы данного ряда для указанного значения аргумента х, если известно количество N членов ряда. Сума...

суммы ряда - C++
f(x)=значок суммы ряда(вверху бесконечность;внизу i=1) (((-1)^2i+1))*(x^2i))\(3i-5)! !-фактариал ^-степень

Суммы ряда - C++
Помогите с написанием в с++. Но как я понимаю что где ошибка в условии. П.5.18.Правил Запрещено размещать задания и решения в виде...

18
grizlik78
Эксперт С++
1966 / 1459 / 120
Регистрация: 29.05.2011
Сообщений: 3,019
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}
0
Zverit
Уничтожитель печенек
277 / 205 / 21
Регистрация: 07.02.2010
Сообщений: 723
21.07.2011, 13:22  [ТС] #3
grizlik78, благодарю, почти понял. Еще для полного усвоения не помешало бы привести пример в коде, желательно с комментариями.
0
grizlik78
Эксперт С++
1966 / 1459 / 120
Регистрация: 29.05.2011
Сообщений: 3,019
21.07.2011, 13:27 #4
Если не ошибаюсь, то данная формула, это разложение косинуса
1
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;
}
1
grizlik78
Эксперт С++
1966 / 1459 / 120
Регистрация: 29.05.2011
Сообщений: 3,019
21.07.2011, 13:37 #6
bigar, что-то ты тут намудрил с i и n
1
Zverit
Уничтожитель печенек
277 / 205 / 21
Регистрация: 07.02.2010
Сообщений: 723
21.07.2011, 13:39  [ТС] #7
grizlik78, bigar, А комментарии можно к программам?
0
grizlik78
Эксперт С++
1966 / 1459 / 120
Регистрация: 29.05.2011
Сообщений: 3,019
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;
}
1
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;
}
0
grizlik78
Эксперт С++
1966 / 1459 / 120
Регистрация: 29.05.2011
Сообщений: 3,019
21.07.2011, 14:01 #10
Цитата Сообщение от bigar Посмотреть сообщение
все норм
Да не, программа-то, наверное, работает, но условие цикла
C++
1
while(i<=n)
станет ложным лишь если произойдёт переполнение в n.
Ведь в цикле i не меняется и не используется (что уже само по себе странно выглядит), а n только растёт
1
bigar
53 / 53 / 23
Регистрация: 18.02.2011
Сообщений: 146
21.07.2011, 14:07 #11
i не должно расти
цикл прекратится когда выполнится условие
C++
1
  if(fabs(u1-u2)<e)break;
1
grizlik78
Эксперт С++
1966 / 1459 / 120
Регистрация: 29.05.2011
Сообщений: 3,019
21.07.2011, 14:09 #12
Это я понимаю. Я говорил только про i и n. Зачем здесь вообще i?
1
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);
так будет понятней и правильней. Разницы никакой
2
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
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
22.07.2011, 11:52 #15
Цитата Сообщение от ITZver Посмотреть сообщение
А как проверить, правильно вычисляет или нет?
ну дык посчитай косинус 0.5 на калькуляторе
1
22.07.2011, 11:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2011, 11:52
Привет! Вот еще темы с ответами:

Суммы ряда - C++
Для вводимых x, N, E вычислить сумму N слагаемых и сумму тех слагаемых, которые по абсолютной величине больше Е (выполнить суммирование для...

Вычисление суммы ряда - C++
Вычисление суммы ряда Потрудитесь один раз нормально оформить свою тему, глядишь, и отвечать будут охотнее.

Вычисление суммы ряда - C++
Вычислить s = sinx/2+sinx^2/4+...+sinx^n/2n #include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; using...

Нахождение суммы ряда... оО - C++
Доброго времени суток! Ребят, помогите пожалуйста решить задачу... Возможно, я бы сам смог её решить, но проблема в том, что я не знаю...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru