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

Вычисление произведения ряда - C++

Восстановить пароль Регистрация
 
Кротяка
 Аватар для Кротяка
5 / 5 / 0
Регистрация: 20.12.2010
Сообщений: 370
01.02.2014, 17:09     Вычисление произведения ряда #1
Подскажите пожалуйста способ для подсчёта произведения ряда http://www.cyberforum.ru/cgi-bin/latex.cgi?S = \prod_{k = 0}^{\propto }\left(1 - \frac{4x^2}{\left(2k + 1 \right)^2 \pi ^2} \right).
Следующий способ вычисления препод забраковал:
C++
1
2
3
4
5
do{
    proizv *= (1 - ((4 * powf(x, 2) / (powf(2 * k + 1, 2) * powf(Pi, 2) ))));
    k++;
  }
  while(fabs(proizv) < eps);
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
01.02.2014, 17:27     Вычисление произведения ряда #2
Кротяка, надо проверять k-ый член произведения, что он отличается не больше чем на eps от 1.
Кротяка
 Аватар для Кротяка
5 / 5 / 0
Регистрация: 20.12.2010
Сообщений: 370
01.02.2014, 17:44  [ТС]     Вычисление произведения ряда #3
Tulosba, можно подробнее?) что то не понял
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
01.02.2014, 17:52     Вычисление произведения ряда #4
Или так fabs((4 * powf(x, 2) / (powf(2 * k + 1, 2) * powf(Pi, 2) )))<eps, но это при подключенным #include<math.h>
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
01.02.2014, 17:56     Вычисление произведения ряда #5
Кротяка, имеем бесконечный ряд, понятно, что надо когда-то остановиться в вычислении этого ряда. А так как в данном случае мы имеем произведение, какое либо существенное изменение его перестанет проявляться когда k-ый член произведение приблизится к единице с учетом заданной точности (eps).
Кротяка
 Аватар для Кротяка
5 / 5 / 0
Регистрация: 20.12.2010
Сообщений: 370
01.02.2014, 18:13  [ТС]     Вычисление произведения ряда #6
Не. Всё не то. Ещё раз объясню задание, теперь уже поподробнее.
«Вычислить значение некоторой функции в заданном диапазоне изменения аргумента х с заданной точностью»
Миниатюры
Вычисление произведения ряда  
zss
Модератор
Эксперт С++
 Аватар для zss
5945 / 5550 / 1783
Регистрация: 18.12.2011
Сообщений: 14,175
Завершенные тесты: 1
01.02.2014, 18:14     Вычисление произведения ряда #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
for(double x=0;x<=M_PI/2.;x+=M_PI/20.)
{
   double s=1.;
   int k=0;
   double eps=1e-10;
   do
   {
      double a=2.*x/(2*k+1)/M_PI;
      a*=a; //квадрат
      s*=(1.-a);
      k++;
   }while(fabs(a)>eps);
   cout<<x<<" "<<s<<" "<<cos(x)<<endl;
}
Кротяка
 Аватар для Кротяка
5 / 5 / 0
Регистрация: 20.12.2010
Сообщений: 370
01.02.2014, 18:17  [ТС]     Вычисление произведения ряда #8
вот как я пытаюсь это сделать:
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
void Function::formula(float X)
{
    x = X;
    k = 0;
    func = cos(x);
    proizv = 1;
        
    do{
        p *= (1 - ((4 * powf(x, 2) / (powf(2 * k + 1, 2) * powf(Pi, 2) ))));
        proizv *= p;
        k++;
    }
    while (fabs(proizv) < eps);
}
int main()
{
           float i;
    float shag;
    Function a;
 
           shag = Pi / 20;
    for (i = 0; i <= Pi / 2 + shag / 2; i += shag)
    {
        a.formula(i);
    }
}
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
01.02.2014, 18:20     Вычисление произведения ряда #9
Цитата Сообщение от Кротяка Посмотреть сообщение
Всё не то.
Это потому что вам думать лень
С учетом последней постановки задачи получается нужно получить таблицу зависимости произведения от аргумента (x). Т.е. произвести вычисления 10 раз. Будет как минимум два вложенных цикла.

Я думаю условие выхода из цикла должно быть такое:
C++
1
while (fabs(proizv - proizv/p) > eps);
Т.е. тут мы проверяем, что произведение изменилось на очередной итерации больше чем на eps, иначе - выходим.
Кротяка
 Аватар для Кротяка
5 / 5 / 0
Регистрация: 20.12.2010
Сообщений: 370
01.02.2014, 18:28  [ТС]     Вычисление произведения ряда #10
Цитата Сообщение от Tulosba Посмотреть сообщение
Это потому что вам думать лень
С учетом последней постановки задачи получается нужно получить таблицу зависимости произведения от аргумента (x). Т.е. произвести вычисления 10 раз. Будет как минимум два вложенных цикла.
не думать лень, а не понятно, как делать, я поэтому и обратился сюда
именно таблицу я и делаю. Естественно, значения получаются неверные
Миниатюры
Вычисление произведения ряда  
Кротяка
 Аватар для Кротяка
5 / 5 / 0
Регистрация: 20.12.2010
Сообщений: 370
01.02.2014, 18:28  [ТС]     Вычисление произведения ряда #11
zss, вы сами это компилировали?
Кротяка
 Аватар для Кротяка
5 / 5 / 0
Регистрация: 20.12.2010
Сообщений: 370
01.02.2014, 18:34  [ТС]     Вычисление произведения ряда #12
Tulosba, результат
Миниатюры
Вычисление произведения ряда  
Кротяка
 Аватар для Кротяка
5 / 5 / 0
Регистрация: 20.12.2010
Сообщений: 370
01.02.2014, 18:35  [ТС]     Вычисление произведения ряда #13
mustimur, это почти то же самое, что и было
zss
Модератор
Эксперт С++
 Аватар для zss
5945 / 5550 / 1783
Регистрация: 18.12.2011
Сообщений: 14,175
Завершенные тесты: 1
01.02.2014, 18:35     Вычисление произведения ряда #14
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вот работающий вариант
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
#include <iostream>
#define _USE_MATH_DEFINES
#include <math.h>
using namespace std; 
 
int main()
{
double eps=1e-6;
for(double x=0;x<=M_PI/2.;x+=M_PI/20.)
{
   double s=1.;
   int k=0;
   double a;
   do
   {
      a=2.*x/(2*k+1)/M_PI;
      a*=a; //квадрат
      s*=(1.-a);
      k++;
   }while(fabs(a)>eps);
   cout<<x<<" "<<s<<" "<<cos(x)<<endl;
}
return 0;
}
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
01.02.2014, 18:51     Вычисление произведения ряда #15
Кротяка, а к чему относится y=cos(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
28
29
30
31
#define _USE_MATH_DEFINES
#include <iostream>
#include <cmath>
#include <iomanip>
 
double formula(double x)
{
    double res = 1;
    int k = 0;
    double term = 1;
    const double eps = 1e-6;
    do
    {
        term = (1 - ((4 * std::pow(x, 2) / (pow((2*k + 1)* M_PI, 2) ))));
        res *= term;
        k++;
    }
    while (std::abs(res - res/term) > eps);
 
    return res;
}
 
int main()
{
    for (double i = 0; i <= M_PI/2; i += M_PI/20)
    {
        std::cout << std::setw(10) << i << std::setw(10) << formula(i) << std::endl;
    }
 
    std::system( "pause" );
}
Кротяка
 Аватар для Кротяка
5 / 5 / 0
Регистрация: 20.12.2010
Сообщений: 370
01.02.2014, 18:51  [ТС]     Вычисление произведения ряда #16
zss, уже лучше правда последнее значение не совсем верно...
Миниатюры
Вычисление произведения ряда  
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
01.02.2014, 22:34     Вычисление произведения ряда #17
Цитата Сообщение от Tulosba Посмотреть сообщение
Кротяка, а к чему относится y=cos(x) ?
Мысли мои прочли...
Кротяка
 Аватар для Кротяка
5 / 5 / 0
Регистрация: 20.12.2010
Сообщений: 370
02.02.2014, 00:18  [ТС]     Вычисление произведения ряда #18
y=cos(x) - это значение функции
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.02.2014, 00:32     Вычисление произведения ряда
Еще ссылки по теме:

Вычисление произведения сумм C++
C++ Вычисление произведения
Вычисление суммы (произведения) конечного ряда + блок-схема C++

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

Или воспользуйтесь поиском по форуму:
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
02.02.2014, 00:32     Вычисление произведения ряда #19
Какой зачем она нужна?
Yandex
Объявления
02.02.2014, 00:32     Вычисление произведения ряда
Ответ Создать тему
Опции темы

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