Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.05.2010, 05:15   #11
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Перевожу на русский:
a_n = (2 * n - 1) / 2 ^ n
=>
a_(n+1) = (2 * (n+1) - 2) / 2 ^ (n+1) =
= (2 * n + 1) / (2 ^ n * 2) =
= [(2 * n + 1) / (2 * n - 1)] * [(2 * n - 1) / 2 ^ n] * 1 / 2 =
= [(2 * n + 1) / (2 * (2 * n - 1))] * [(2 * n - 1) / 2 ^ n] =
= [(2 * n + 1) / (4 * n - 2)] * [a_n]
Т.о. если нам известно значение некоторого a_i (например, a_0), то с помощью этой рекуррентной формулы мы можем найти любый a_j (j > i).
a_0 = (2 * 0 - 1) / 2 ^ 0 = -1 / 1 = -1

Цитата:
так почему не сделать так
Код:

res = (2 * n - 1) / (pow(2, n));
Потому что это нерационально. Гораздо проще один раз за итерацию помножить и поделить, чем высчитывать (целую) степень (целого) числа с помощью функции
Код:
double pow(double, double);
Не считать же Sum_(i=0)^(n) [(2^i * 3^i * ... * m^i) / ((m+1)^i * ... * k^i)] как
Код:
double sum = 0;
for (int i = 0; i <= n; i++)
   sum += (pow(2, i) * ... * pow(m, i) / ...);
Когда можно
Код:
double sum = 0;
double a = (2 * 3 * ... * (m-1)) / (m * ... * k);
double b = 1;
for (int i = 0; i <= n; i++)
   {
   sum += b;
   b *= a;
   }
Примечание: многоточия здесь стоят чисто из математических соображений, никак не программистских
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 06.05.2010, 01:31   #12
Syltan
Заблокирован
 
Регистрация: 27.08.2009
Сообщений: 569
По умолчанию

Скажите ,вот этот код, почему результат не такой
Код:
//Почему здесь не задаётся начальное значение n
//Почему результат постоянно -1 иб ольше ничего кроме него?
//Как сдлеать это ткод полностью работоспособным?
#include <iostream>
#include <conio.h>
#include <math.h>
using namespace std;
 
int main()
{
long k;
double an,s, eps;
an=-1;
s=0;
k=0;
cin>>eps;
while(fabs(an)>eps);
{
s=s+an;
an=an*(2*k+1)/(4*k-2);
k++;
}
cout<<s;
getch();
}

как в этом коде:
Код:
//Этот код правильней?
#include <iostream>
#include <math.h>
using namespace std;

int main()
{
double start;
double eps;
double n;
double last;

cout << "enter start count: ";
cin >> start;
cout << endl << "enter epsilon: ";
cin >> eps;

n = 1;

do
{
last = start;
start = last + (2 * n - 1) / pow(2,n);
n++;
}
while (fabs(start - last) >= eps);

cout << endl << "result = " << start;

cin.get();
return 0;
}

Последний раз редактировалось Syltan; 06.05.2010 в 01:38.
Syltan вне форума Ответить с цитированием
Старый 06.05.2010, 08:19   #13
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Если я правильно понял, тебе нужна просто сумма ряда с определенной точностью
Код:
#include <iostream>
#include <math.h>
using namespace std;

int main()
{
double start = 0;
double eps;
int n = 1;
double last = 0;


cout << endl << "enter epsilon: ";
cin >> eps;
n = 1;
do
{
last = start;
start = last + (2 * n - 1) / pow(2,n);
n++;
}
while (fabs(start - last) >= eps);

cout << endl << "result = " << start;

cin.get();
return 0;
}
В этом случае находится сумма ряда от первого значения, до того как будет достигнута точность, при условии конечно, что сумма сходится.
Члены ряда будут принимать значения: 1/2, 3/4, 5/8, 7/16, 9/32, ...

В первом случае вообще непонятно, что у тебя считать будет, если ты пытался найти значение того же ряда тогда надо так:
Код:
an=1/2; k=1; s=0;
while(fabs(an)>eps);
{s+=an;
  k++;
  an*=(2*k-1)/(2*(2*k-3));
}
s+=an;         //это для верности, не уверен, что нужно
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.

Последний раз редактировалось Stilet; 06.05.2010 в 09:06.
mrChester вне форума Ответить с цитированием
Старый 06.05.2010, 14:34   #14
Syltan
Заблокирован
 
Регистрация: 27.08.2009
Сообщений: 569
По умолчанию

Вы можете точный расчёт кто-то написать, а то я так и не могу понять, какой точный код правильно решает.
Вот так правильно?

Код:
#include <iostream>
#include <math.h>
using namespace std;

int main()
{
   double eps;
   double sum = 0.0, ak;
   int k = 1;

   cout << "enter espsilon: ";
   cin >> eps;

   do {
      ak = (2 * k - 1) / pow(2.0, k);
      sum += ak;
      k++;
   } while (fabs(ak) >= eps);


      cout << "result = " << sum;
     
      cin.get();
      return 0;
}

Последний раз редактировалось Syltan; 06.05.2010 в 16:45.
Syltan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Суммирование рядов в С++ defol-777 Помощь студентам 2 05.05.2010 11:10
Суммирование рядов Diana pretty Помощь студентам 1 13.04.2010 12:07
Сумма рядов Olech4ka Фриланс 6 28.05.2009 10:38
Форматы рядов данных maxic Microsoft Office Excel 0 13.10.2008 18:02