Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вычислить сумму ряда 
V
    Опции темы
ioManip
Дата 11.11.2012, 06:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск

Репутация: нет
Всего: нет



Привет! Вообщем совсем запутался с этой точностью...., а точнее не пойму, что значит вычислить сумму ряда с  точностью Е. (на рис. задачка 2). То есть какое условие должно быть, чтобы считать, что точность достигнута?
Код

#include <iostream>
#include <math.h>

using namespace std;

// Факториал
unsigned long Fact(int x)
{
    unsigned int Fact = 1;
    
       for (int i = 1; i <= x; i++)
            Fact = Fact * i;
    
    return Fact;
}

// Ряд
unsigned long Calc(unsigned int n)
{
    return Fact(n) / (3 * pow(n,n));
}


int main()
{
    double e;           //точность
    double s = 0;          //сумма
    unsigned int n = 1; 
    
    cout << "Введите точность " << endl;
    cout << "e = ";
    cin >> e; 
    
    
    /* Вот здесь не пойму что нужно писать! */
    
    
    cout << "Сумма = ";
    cout << s << endl; 
    return 0; 
}


Присоединённый файл ( Кол-во скачиваний: 13 )
Присоединённый файл  2012_11_08_003.jpg 20,60 Kb
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
feodorv
Дата 11.11.2012, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(ioManip @  11.11.2012,  07:12 Найти цитируемый пост)
unsigned long Calc(unsigned int n)

Так не пойдёт. Результат должен быть double:
Код

double Calc(unsigned int n)

Впрочем, для факториала тоже, так как факториал растёт очень быстро.

Цитата(ioManip @  11.11.2012,  07:12 Найти цитируемый пост)
не пойму, что значит вычислить сумму ряда с  точностью Е

Это значит, что Вы должны вычислять частичную сумму ряда до тех пор, пока её значение не станет отличаться от реальной суммы ряда на очень малую величину E, заданную заранее.

Увы ряд не знакопеременный, поэтому не можем применить критерий, что суммируем до тех пор, пока очередной член ряда не станет меньше E. Придётся проанализировать ряд аналитически с тем, чтобы оценить погрешность вычислений, если мы ограничимся первыми N членами ряда.

Итак, рассмотрим a(n+1) / a(n). Это будет (n / (n+1)) ** n, что для больших n стремится к 1/e (где e - основание натуральных логарифмов). В любом случае при больших n величина (n / (n+1)) ** n меньше, чем 1/2 (так как e > 2), отсюда:
Код

a(n+1) < 1./2. * a(n)

Поэтому мы можем оценить остаток ряда (после суммирования первых N членов) как
Код

сумма по к от N+1 до бесконечности от 1/3 * fact(k) / k ** k < сумма по к от N+1 до бесконечности от 1/3 * 1 / 2**k = 1/3 * 1/ 2**N

Таким образом, нужно суммировать первых N членов ряда, где N таково, что ( 1/3 * 1/2**N ) < E.

Добавлено @ 09:45
Цитата(ioManip @  11.11.2012,  07:12 Найти цитируемый пост)
   /* Вот здесь не пойму что нужно писать! */

Допустим, что мы умеем вычислять очередной член ряда:
Код

double elem( unsigned int n )
{
  return ...;
}

Как тогда суммировать:
Код

double sum = 0;
unsigned int n = 1;
double E=1.E-6;
do
{
  sum += elem( n );
  sumrest = 1./3./pow(2.,n);
  n++;
} while( sumrest >= E );


Это сообщение отредактировал(а) feodorv - 11.11.2012, 09:52


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
ioManip
Дата 11.11.2012, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск

Репутация: нет
Всего: нет



feodorv, И снова Вы меня выручаете smile Спасибо.
Вот вроде получилось(гляньте одним глазком):
Код

#include <iostream>
#include <math.h>

using namespace std;

// Факториал
double Fact(int x)
{
    unsigned int Fact = 1;
    
       for (int i = 1; i <= x; i++)
            Fact = Fact * i;
    
    return Fact;
}

double Calc(double y)
{
    double e = y;
    double ac = 1;  //промежуточная точность
    double an = 0;   //след. член ряда
    double am = 0;   //пред. член ряда
    unsigned int n = 1;
    
    while (ac >= e)
    {
        n++;
        an = Fact(n) / (3 * pow(n,n));
        ac = fabs(an - am);
        am = an;
    }
    
    return an;
}

int main()
{
    double e;          
  
    cout << "Введите точность " << endl;
    cout << "e = ";
    cin >> e;
     
    cout << "Сумма = ";
    cout << Calc(e) << endl; 
    
    return 0; 
}

Считает,только правильно ли? Я так понимаю правильность суммы нужно проверять с ручкой и листом бумаги?
P.S. Что означают две звездочки? (n / (n+1)) ** n Супер умножение? smile Или указатель на указатель?
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
feodorv
Дата 11.11.2012, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(ioManip @  11.11.2012,  12:59 Найти цитируемый пост)
double Fact(int x)
{
    unsigned int Fact = 1;
    
       for (int i = 1; i <= x; i++)
            Fact = Fact * i;
    
    return Fact;
}

В том-то и дело, что Fact должна быть double. Цикл можно начинать с 2 (умножение на 1 сильной роли не играет).
Цитата(ioManip @  11.11.2012,  12:59 Найти цитируемый пост)
double Calc(double y)
{
    double e = y;
    double ac = 1;  //промежуточная точность
    double an = 0;   //след. член ряда
    double am = 0;   //пред. член ряда
    unsigned int n = 1;
    
    while (ac >= e)
    {
        n++;
        an = Fact(n) / (3 * pow(n,n));
        ac = fabs(an - am);
        am = an;
    }
    
    return an;
}

Не понял совершено, что это за цикл такой странный. Где вычисление суммы? Где оценка остатка ряда?


Цитата(ioManip @  11.11.2012,  12:59 Найти цитируемый пост)
Что означают две звездочки? (n / (n+1)) ** n Супер умножение? smile Или указатель на указатель? 

Ну, эээ, возведение в степень smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
ioManip
Дата 12.11.2012, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск

Репутация: нет
Всего: нет



feodorv,  а сейчас ближе к истине?
Код

#include <iostream>
#include <math.h>

using namespace std;

// Факториал
double Fact(int x)
{
    double Fact = 1;
       for (int i = 2; i <= x; i++)
            Fact = Fact * i; 
    return Fact;
}

// След. элемент ряда
double next_elem(unsigned int n_)
{
    return Fact(n_) / (3 * pow(n_,n_));
}

// Сумма
double Calc(double n_, double e_)
{
    double e = e_;
    unsigned int n = n_;
    double sum = 0;
    double sumrest;
    
    do
    {
        sum = sum + next_elem(n);
        sumrest = 1./3./pow(2.,n);
        n++;
    } while (sumrest >= e);
    
    return sum;
}

int main()
{
    unsigned int n = 1;
    double e;
    
    cout << "Введите точность " << endl;
    cout << "e = ";
    cin >> e;
     
    cout << "Сумма = ";
    cout << Calc(n,e) << endl; 
    
    return 0; 
}

--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
feodorv
Дата 12.11.2012, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(ioManip @  12.11.2012,  09:32 Найти цитируемый пост)
ближе к истине?

Да  smile  Должно в итоге получиться значение, чуть больше 0.6 smile 


Цитата(ioManip @  12.11.2012,  09:32 Найти цитируемый пост)
double Calc(double n_, double e_)

А вот здесь зачем n_ double? Да и не нужен этот аргумент функции, всё равно отсчитывать начиная с 1...

И ещё одна тонкость (это непринципиально, просто аккуратно):
Цитата(ioManip @  12.11.2012,  09:32 Найти цитируемый пост)
    unsigned int n = n_;

Цитата(ioManip @  12.11.2012,  09:32 Найти цитируемый пост)
double Fact(unsigned int x)
{
    double Fact = 1;
       for (unsigned int i = 2; i <= x; i++)
            Fact = Fact * i; 
    return Fact;
}




--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
ioManip
Дата 13.11.2012, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск

Репутация: нет
Всего: нет



feodorv, еще раз Большое спасибо!  smile 
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0791 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.