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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вычисление ряда на СИ++, Рекуррентная формула 
:(
    Опции темы
Максим1989
Дата 12.4.2011, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 21.3.2011

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



Добрый день (вечер,ночь, утро) всем! Мне, начинающему новичку, очень нужна подсказка профессионалов по СИ++.
Пытаюсь выполнить лабораторную работу следующего содержания: Используя оператор цикла, найти сумму элементов ряда с точностью ε=10-4, общий член которого A_n=(2^n*n!)/n^n.
Код программы, хочу выдумать сам, но мет.указания ставят в тупик:
Методические указания
1.При определении суммы членов ряда следует использовать рекуррентную формулу для получения следующего члена ряда
2.При составлении программы считать, что точность достигнута,  если  A_n<ε/
Надеюсь на совет

PM MAIL   Вверх
kemiisto
Дата 12.4.2011, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

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



Почитай эту тему.


--------------------
PM MAIL WWW GTalk Jabber   Вверх
kemiisto
Дата 12.4.2011, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

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



Максим1989, а ты точно формулу списал? Проверь-ка, будь так добр. 

В числителе произведение двойки в степени n и факториала n или двойка в степени n * n! ?
В знаменателе точно n^n?

Это сообщение отредактировал(а) kemiisto - 12.4.2011, 23:32


--------------------
PM MAIL WWW GTalk Jabber   Вверх
kemiisto
  Дата 13.4.2011, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

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



В общем тебе дано выражение для общего члена рекуррентной последовательности

A(n) = 2^n * n! / n^n

Тебе нужно найти рекуррентную формулу вида A(n) = f(n, A(n-1), A(n-2), ..., A(n-p)), n >= p + 1. Я, честно сказать, не знаю как такие задачи решаются. Вот в обратную сторону... Там есть метод обратной подстановки, а тут...

В числителе проблем, вроде как, нет. Константа в степени n и факториал n рекурсивно очень просто выражаются, но вот n ^ n через n-1, n-2, ... Тут я в тупике.

Можно попробовать, например, так. 

A(n) = 2^n * n! / n^n
A(n - 1) = 2^(n-1) * (n-1)! / (n-1)^(n-1)

Теперь поделим одно на другое и упростим:

A(n) / A(n - 1) = 2 * (1 - 1 / n)

Тогда A(n) = 2 * (1 - 1 / n) *  A(n - 1).

Можно быстренько себя проверить (начиная с n = 2):
Код

#include <iostream>
#include <cmath>

double factorial(int n)
{
  double fact = 1.0;
  for (int i = 1; i <= n; ++i) 
  {
    fact *= i;
  }
  return fact;
}

int main(int argc, const char* argv[])
{
  double a_n = 2;
  for (int n = 2; n < 10; ++n) 
  {
    double a_n_closed = std::pow((double)2, n) * factorial(n) / std::pow((double)n, n);
    a_n = 2 * std::pow(1 - (double)1 / n, n - 1) * a_n;
    std::cout << a_n_closed << ' ' << a_n << std::endl;
  }
  
  return 0;
}


Вроде, одно и тоже получается. Ну избавились от факториала (для вычисления a_n он не нужен), уже неплохо. smile 

Само решение, вроде как
Код

#include <iostream>
#include <cmath>

int main(int argc, const char* argv[])
{
  const double eps = 10e-4;
  
  int n = 1;
  double a_n = 2;
  double sum = 0;
  
  while (a_n >= eps) 
  {
    sum = sum + a_n;
    n += 1;
    a_n = 2 * std::pow(1 - (double)1 / n, n - 1) * a_n;
    std::cout << a_n << std::endl;
  }
  
  std::cout << sum << std::endl;
  
  return 0;
}


Писал "на коленках" со слипающимися глазами. smile Так что глаз да глаз.

Но мне не нравится знаменатель, ей богу не нравится.

Это сообщение отредактировал(а) kemiisto - 13.4.2011, 00:47


--------------------
PM MAIL WWW GTalk Jabber   Вверх
Максим1989
Дата 13.4.2011, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 21.3.2011

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



Здравствуй kemiisto. Во-первых: спасибо большое за такой труд! Формула, рассмотренная тобою, совершенно верно понята.
Я даже прикреплю своё задание в формате Word. Задание 12. (Я просто не знаю как на форум формулы в нормальном виде вставляются) 
У меня, кстати, тоже вначале возникла такая мысль, что нужно избавиться от факториала. Но не осилил, несмотря на то что в задании приведен пример. (Я сфоткал то, на чем остановился и вложил в этот же архив).
И самое главное - когда искал подобные примеры в инете, налетел на ... решение своего задания! Но там голый код. А как формулу преобразовыввали непонятно. Еще хочу сказать, что коды на СИ++ написанные тобою, на мой взгляд абсолютно верны, так как результат вычислений при сравнении с тем что я приложил, практически сходится.

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  _______.rar 600,49 Kb
PM MAIL   Вверх
kemiisto
Дата 13.4.2011, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

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



Максим1989, а ты точно такое же решение нашёл по сути. smile  Только я опечаточку допустил.
Цитата(kemiisto @  12.4.2011,  23:46 Найти цитируемый пост)
Тогда A(n) = 2 * (1 - 1 / n) *  A(n - 1).

Вот тут, конечно, A(n) = 2 * (1 - 1 / n) ^ (n - 1) *  A(n - 1)

Их рекуррентная формула:
A(n) = 2 * n * (n - 1) ^ (n - 1) / n ^ n *  A(n - 1)
упрощается дальше до моей. Делим числитель и знаменатель на n
A(n) = 2 * (n - 1) ^ (n - 1) / n ^ (n - 1) *  A(n - 1)
теперь степени при n - 1 и n одинаковые, переписываем
A(n) = 2 * ((n - 1) / n) ^ (n - 1) *  A(n - 1)
и почленно делим n - 1 на n
A(n) = 2 * (1 - 1 / n) ^ (n - 1) *  A(n - 1)

Ты в в своём решении (от руки) просто до конца не дошёл.

2 * (n + 1)! * n ^ n / ((n + 1)^(n + 1) * n!) = | (n + 1)! = n! * (n + 1) | =
2 * n! * (n + 1) * n ^ n / ((n + 1)^(n + 1) * n!) = | делим числитель и знаменатель на n! |
2 * (n + 1) * n ^ n / (n + 1)^(n + 1) = | делим числитель и знаменатель на (n + 1) | =
2 * n ^ n / (n + 1)^n = | степни одинаковые ... |

В реализации разница небольшая. 
У них С, а ты просил С++.
У них float, у меня double. Они, пожалуй, правы, т.к. для точности 10e-4 float достаточно. Это уже привычка у меня просто к double.

Добавлено через 30 секунд
Цитата(Максим1989 @  13.4.2011,  20:29 Найти цитируемый пост)
Я просто не знаю как на форум формулы в нормальном виде вставляются

Никак, к сожалению.


--------------------
PM MAIL WWW GTalk Jabber   Вверх
Shaggie
Дата 14.4.2011, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 570
Регистрация: 21.12.2006
Где: outer space

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



Цитата(Максим1989 @  13.4.2011,  22:29 Найти цитируемый пост)
Я просто не знаю как на форум формулы в нормальном виде вставляются

user posted image

Картинкой, вот сервис, например.


--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
kemiisto
  Дата 14.4.2011, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

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



Shaggie, оно, конечно, да. МАЛЕНЬКИЙ нюанс - надо знать TeX. smile  


--------------------
PM MAIL WWW GTalk Jabber   Вверх
Максим1989
Дата 14.4.2011, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 21.3.2011

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



Уважаемый kemiisto! Спасибо огромное! 
Ты написал очень много ценной информации. Но чтобы осознать её мне надо время, а сейчас надо бежать на лекции.
Я поздним вечером обязательно что-нибудь напишу!!!

Это сообщение отредактировал(а) Максим1989 - 14.4.2011, 14:40
PM MAIL   Вверх
Максим1989
Дата 14.4.2011, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 21.3.2011

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



Уважемый kemiisto! Вообщем,  изучив всё написанное тобой от корки до корки, и, применив на практике, могу сказать следующее: Честь тебе и хвала! Никаких претензий по качеству! Всё безупречно! Ещё раз благодарю!  smile 
Shaggie тоже спасибо за подсказку. А то я так бы и мучался с картинками.  smile 

Это сообщение отредактировал(а) Максим1989 - 14.4.2011, 21:53
PM MAIL   Вверх
kemiisto
  Дата 14.4.2011, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

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



Максим1989, пожалуйста. smile 


--------------------
PM MAIL WWW GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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