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

Посчитать приблизительное значение функции sin по заданной формуле - C++

Восстановить пароль Регистрация
 
Aymurat
90 / 84 / 25
Регистрация: 07.11.2014
Сообщений: 572
Завершенные тесты: 5
30.07.2015, 08:21     Посчитать приблизительное значение функции sin по заданной формуле #1
Дальше решаю задачник Абрамяна через c++
Пришел на 23. Вот мое решение:
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 <iostream>
#include <conio.h>
#include <math.h>
using namespace std;
 
double fact(int n) {
    int i,b=1;
for (i=1; i<=n; i++)
    {
        b=i*b;
    }
    return b;
                    }
 
int main()
{
    int n;
    double x,b,z,s,i;
    cout<<"x="; cin>>x;
    cout<<"n="; cin>>n;
        s=-1;
    b=0;
    for (i=1; i<=n; i=i+2)
    {
        b=(pow(x,i)/fact(i)+b); 
        b=b*s;
    }
        cout<<b;
}
Задание:
[cut]

Я примерно вижу решение, мне нужен еще 1 цикл, например, z=1; z<=n; z++; но, чтобы его можно было использовать в {} for (i=1; i<=n; i=i+2) этого цикла. Тогда можно будет менять значение s n-раз, благодаря pow. Прошу помощи.

З.Ы. сделал функцию для вычисления факториала.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2015, 08:21     Посчитать приблизительное значение функции sin по заданной формуле
Посмотрите здесь:

C++ Вычислить значение по заданной формуле
C++ Вычислить выражение по заданной формуле 2 (Функции)
Цикл: вычислить значение выражения по заданной формуле C++
Вычислить значение функции a = b ^2 sin (b), причем b изменяется от 0,9 до 1,7 с шагом 0,2. Найти среднее значение разности между элементами C++
Написать функцию , вычисляющую с заданной точноcтью eps, значение y = x^(1/k) по итерационной формуле C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,963
30.07.2015, 08:28     Посчитать приблизительное значение функции sin по заданной формуле #2
C++
1
2
3
4
5
6
7
8
9
10
11
double x;
int n;
cin>>x>>n;
double mul=x,div=1,res=0;
for(int i=1;i<=n;i+=2)
{
    res+=mul/div;
    mul*=-x*x;
    div*=(i+1)*(i+2);
}
cout<<res<<endl;
Aymurat
90 / 84 / 25
Регистрация: 07.11.2014
Сообщений: 572
Завершенные тесты: 5
30.07.2015, 08:34  [ТС]     Посчитать приблизительное значение функции sin по заданной формуле #3
Сделал некоторые правки на int(main){} вот:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main()
{
    int n;
    double x,b,z,s,i;
    cout<<"x="; cin>>x;
    cout<<"n="; cin>>n;
    b=0;
    s=-1;
    for (i=1; i<=n; i=i+2)
    {
        for (z=1; z<=n; z++)
        {
    b=(pow(x,i)/fact(i)+b); 
    b=b*pow(s,z);
    }
}
        cout<<b;
}
Сделал 2 цикла, однако результат все равно не хороший

Добавлено через 5 минут
Renji, вы гений!)

Добавлено через 1 минуту
Но результат почему-то не точный, проверяю через PT4.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
30.07.2015, 08:38     Посчитать приблизительное значение функции sin по заданной формуле #4
Цитата Сообщение от Aymurat Посмотреть сообщение
Я примерно вижу решение, мне нужен еще 1 цикл, например, z=1; z<=n; z++; но, чтобы его можно было использовать в {} for (i=1; i<=n; i=i+2) этого цикла.
Зачем? Декомпозиция любой задачи делается по минимуму связей, поэтому функция факториала должна только вычислять факториал и не заниматься посторонними действиями, тогда она будет связана с вызывающей частью программы только параметром (аргументом в терминах своей подзадачи вычисления математической функции) и значением. Всякий смысл любых дополнительных действий добавит связей. Тебе нужен цикл в вызывающей части программы, а уже в его теле требуется вызывать функцию факториала. Этот цикл должен иметь параметр-счётчик и второй знакопеременный параметр (
Параметр цикла есть величина, изменяемая в заголовке цикла и непосредственно используемая в теле цикла в иных целях кроме адресации элементов контейнера, например, массива.
,
Счётчик цикл есть величина, изменяемая в заголовке цикла и принимающая ряд последовательных значений.
, параметр цикла может как быть, так и не быть счётчиком цикла, а счётчик цикла может как быть, так и не быть параметром цикла), счётчиком не являющийся.
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,963
30.07.2015, 08:39     Посчитать приблизительное значение функции sin по заданной формуле #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Aymurat Посмотреть сообщение
Но результат почему-то не точный, проверяю через PT4.
А он и не должен быть точным. Такие ряды сходятся к нужному значению (синусу в нашем случае) лишь при бесконечном числе членов.

Тем не менее, поднимите n до пятнадцати и результат должен стать весьма приличным.
Aymurat
90 / 84 / 25
Регистрация: 07.11.2014
Сообщений: 572
Завершенные тесты: 5
30.07.2015, 08:45  [ТС]     Посчитать приблизительное значение функции sin по заданной формуле #6
Цитата Сообщение от Renji Посмотреть сообщение
Тем не менее, поднимите n до пятнадцати и результат должен стать весьма приличным.
Я уже делал так, я тоже заметил это. Но так как мне твердили что результат должен совпадать с PT4, я старался по другому. Тем не менее спасибо всем за отклик. Проблема решена. Оказывается, так и должно быть, +- 0,01)
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
30.07.2015, 08:49     Посчитать приблизительное значение функции sin по заданной формуле #7
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
double degree(double x, unsigned int n);
double fact(unsigned int n);
double MySin(double x, unsigned int n);
int main()
{
 double x;
 double y;
 unsigned int n
 std::cout<<"x=";
 std::cin>>x;
 std::cout<<"n=";
 std::cin>>b;
 y=MySin(x,n);
 std::cout<<"y="<<y<<std::endl;
 return 0;
}
double degree(double x, unsigned int n)
{
 double result;
 for (result=1.0; n>0; --n)
 {
  result*=x;
 }
 return result;
}
double fact(unsigned int n)
{
 double result;
 for (result=1.0, n!=0; --n)
 {
  result*=(double)n;
 }
 return result;
}
double MySin(double x, unsigned int n)
{
 double result;
 unsigned int i;
 double k;
 for (result=0.0, i=0, k=1.0; i<n; ++i, k=-k)
 {
  result+=k*degree(x, 2*n+1)/fact(2*n+1);
 }
 return result;
}
. И ни каких гвоздёв.
Aymurat
90 / 84 / 25
Регистрация: 07.11.2014
Сообщений: 572
Завершенные тесты: 5
30.07.2015, 08:50  [ТС]     Посчитать приблизительное значение функции sin по заданной формуле #8
Слишком сложно для меня. Я начал не с теории, а с задач. Учусь так сказать на ошибках, пока не осилю Ваш код, спс за ответ.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
30.07.2015, 08:53     Посчитать приблизительное значение функции sin по заданной формуле #9
Ну теорию зубрить бесполезно.
Mr.X
Эксперт С++
 Аватар для Mr.X
2802 / 1578 / 247
Регистрация: 03.05.2010
Сообщений: 3,666
30.07.2015, 12:21     Посчитать приблизительное значение функции sin по заданной формуле #10
Renji, с синусом сравнивали?
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/////////////////////////////////////////////////////////////////////////////////////////
//Задачник Абрамяна
//Задание For23
//Дано вещественное число X и целое число N (> 0). Найти значение выражения
//  X - X^3/(3!) + X^5/(5!) - ... + (-1)^N * X^(2*N + 1) / ((2*N+1)!)
//Полученное число является приближенным значением функции sin в точке X.
/////////////////////////////////////////////////////////////////////////////////////////
#include <cmath>
#include <iomanip>
#include <iostream>
#include <limits>
/////////////////////////////////////////////////////////////////////////////////////////
typedef unsigned long long  T_int;
/////////////////////////////////////////////////////////////////////////////////////////
const   double  VAL_MIN     =   std::numeric_limits<double>::min();
const   double  VAL_MAX     =   std::numeric_limits<double>::max();
/////////////////////////////////////////////////////////////////////////////////////////
double  sine_approximation_of_for_series_len
    (
        double  x,
        T_int   n
    )
{
    double  res_sum     =   0;
    double  member      =   -1;
 
    for( T_int  i = 1; i <= 2 * n + 1; ++i )
    {
        member  *=  x / i;
 
        if  (
                    abs( member )   <=  VAL_MIN
                ||  abs( member )   >=  VAL_MAX
            )
        {
            break;
        }
 
        if( i % 2 )
        {
            res_sum     +=      member
                            *=  -1;
        }//if
    }//for
 
    return  res_sum;
}
/////////////////////////////////////////////////////////////////////////////////////////
int     main()
{
    for(;;)
    {
        std::cout   <<  "X = ";
        double  x   =   0;
        std::cin    >>  x;
 
        std::cout   <<  "N = ";
        T_int     n   =   0;
        std::cin    >>  n;
 
        std::cout   <<  std::setprecision(40)
 
                    <<  sine_approximation_of_for_series_len
                            (
                                x,
                                n
                            )
 
                    <<  std::endl
                    <<  sin(x)
                    <<  std::endl
                    <<  std::endl;
    }//for
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2015, 13:37     Посчитать приблизительное значение функции sin по заданной формуле
Еще ссылки по теме:

C++ Разработать функцию f(x), вычисляющую значение по заданной формуле
C++ Вычислить значение по заданной формуле
C++ Написать функцию вычисляющую значение по заданной формуле

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

Или воспользуйтесь поиском по форуму:
zss
Модератор
Эксперт С++
 Аватар для zss
5946 / 5551 / 1784
Регистрация: 18.12.2011
Сообщений: 14,181
Завершенные тесты: 1
30.07.2015, 13:37     Посчитать приблизительное значение функции sin по заданной формуле #11
Советую все же посмотреть вот эту тему
Вычисление функций разложением в ряд Тейлора
Там есть такая функция:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
double mysin(double x,double eps)
{
    double s,an;
    int n;
    n=1;
    an=x;
    s=0;
    while(fabs(an)>eps)
    {
         s+=an;
         n++;
         an*=-x*x/(2.*n-1.0)/(2.0*n-2.0); 
    }
    return s;
}
Yandex
Объявления
30.07.2015, 13:37     Посчитать приблизительное значение функции sin по заданной формуле
Ответ Создать тему
Опции темы

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