Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.70
SKILHUNT
0 / 0 / 0
Регистрация: 10.10.2012
Сообщений: 14
#1

Вычислить сумму n членов ряда Тейлора для косинуса - C++

10.10.2012, 23:26. Просмотров 3159. Ответов 25
Метки cos (Все метки)

По заданию дано число X, надо вычислить сумму n членов рада тейлора для косинуса и сравнить с результатом библиотечного косинуса. Получается, что x и n задаются пользователем. Я сделал наброски, но при вычислении у меня n приходится подбирать чтобы результаты совпали.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<stdio.h>
#include<math.h>
int main()
{
double x,n,c,mx2 = -x*x,part=1,sum=1;
int i;
    for(;;){
    printf("Vvedite x:\n");
    scanf("%lf", &x);
    printf("Vvedite n:\n");
    scanf("%lf",&n);
    if(n<=0)break;
    for (i = 2; i < n; i+=2) {
        part *= mx2/((i-1)*i);
        sum += part;
    }
    c=cos(x);
    printf("cos(%lf) = %lf\n", x, sum); 
    printf("cos(%lf) = %lf\n", x, c);
}
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.10.2012, 23:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вычислить сумму n членов ряда Тейлора для косинуса (C++):

Подсчитать сумму членов ряда с точностью до 0.000001 и сумму первых 10 членов ряда - C++
Добавлено через 10 часов 32 минуты Для ряда, члены которого вычисляются по формуле, соответствующей Вашему индивидуальному заданию,...

Вычислить сумму N членов ряда - C++
Вычислить сумму N членов ряда Вот мой код, но считает почему то не правильно=( Кто подскажет в чем проблема? Буду очень благодарен! ...

Вычислить сумму первых N членов ряда - C++
Помогите написать код: Вычислить сумму первых N членов ряда, значения N и x ввести с клавиатуры. {deleted} П.5.18.Правил ...

Вычислить сумму n первых членов ряда - C++
Не используя стандартные функции(за исключением abs),вычислить сумму n первых членов следующего ряда(n,x,a вводится с клавиатуры). ...

Вычислить сумму n членов заданного ряда - C++
Вычислить сумму n членов ряда согласно условию задачи: x+{x}^{2}/2!+{x}^{4}/4!+...

Вычислить сумму n первых членов ряда . - C++
Дано целое число n и вещественное число x. Вычислить сумму n первых членов ряда . Полученное число должно являться приближенным значением...

25
nullpointer
46 / 46 / 5
Регистрация: 30.03.2009
Сообщений: 523
11.10.2012, 16:08 #16
Ну вообще я не вижу,что в задании написано n вводить с клавиатуры. Смысл этого задания как раз и состоит в том,чтобы программа автоматически рассчитывала сколько ей нужно членов ряда использовать,чтобы получилсь достаточно точное значение. Я вам уже писал,что нужно сделать. Вводите какую-нибудь эпсилон равную, например, 0.0001, и ставите условие выполнять вычисление до тех пор пока разность табличного косинуса(его значение у вас хранится в переменной с) и вычисленного вами значения больше этого эпсилон. Только тогда вам сначала надо табличный косинус посчитать, а уже после него цикл реализовывать.

Добавлено через 2 минуты
я писал подобную программу, только там через ряд Тейлора считался логарифм
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
#include <stdio.h>
#include <conio.h>
#include <math.h>
void main ()
{
int n,a,d;
float eps,sl,sp,x;
n=0; a=10;
printf("vvedite argument x\n");
scanf("%f",&x);
sl=log(x);
printf("vvedite to4nost' Eps\n");
scanf("%f",&eps);
 
while (fabs(sl-sp)>eps){
        sp=0.0;
        for (n=0;n<a;n++){
                d=1;
                sp+=pow(x - 1, n + n + 1) / ((n + n + 1) * pow(x+1, n + n + 1));
        }   sp*=2;
        a++;
printf("\t#%d, log %f, summa %f\n",a-10,sl,sp);
}
_getch();
}
0
SKILHUNT
0 / 0 / 0
Регистрация: 10.10.2012
Сообщений: 14
11.10.2012, 16:36  [ТС] #17
с нас просто требуют, чтобы программа была зациклена и при введении n<=0 она выходила, поэтому я и думал, что n должно задаваться пользователем. Тобишь получается, что я должен вывести сколько n членов ряда в сумме=косинусу?
0
nullpointer
46 / 46 / 5
Регистрация: 30.03.2009
Сообщений: 523
11.10.2012, 16:57 #18
Цитата Сообщение от SKILHUNT Посмотреть сообщение
Тобишь получается, что я должен вывести сколько n членов ряда в сумме=косинусу?
Исходя из того задания,что тут прикреплено программа сама должна посчитать сколько ей нужно членов ряда,чтобы его сумма равнялась косинусу. Другое дело,если вам преподаватель сказал самим вводить число членов ряда,но тогда и точность вычисления будет соответствующая,потому что может просто не хватить этих самых членов,чтобы их сумма равнялась косинусу,если вы введете их мало. А выводить количество этих члено или не выводить это уж ваше дело.
1
SKILHUNT
0 / 0 / 0
Регистрация: 10.10.2012
Сообщений: 14
12.10.2012, 14:55  [ТС] #19
спасиб за информацию, буду дальше ковырять

Добавлено через 3 часа 55 минут
блин, чет я на одном месте завтыкал, как (2*n)! расписать через for?

Добавлено через 17 часов 53 минуты
Никто не может подсказать такую мелочь? =(
0
accept
4825 / 3246 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
12.10.2012, 15:16 #20
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
#include <stdio.h>
#include <locale.h>
#include <math.h>
 
int main(void)
{
    double x, eps, s, sl;
    long z;
    short k;
    char line[100];
    
    if (setlocale(LC_ALL, "C") == NULL)
        fprintf(stderr, "Failed to set locale!\n");
    printf("Программа вычисляет сумму ряда:\n"
           "sin(x) = x - (x ^ 3) / 3! + (x ^ 5) / 5! - (x ^ 7) / 7! + ...\n");
    fflush(stdout);
    do {
        do {
            printf("Введите x ");
            fflush(stdout);
        } while (fgets(line, sizeof line, stdin) == NULL
              || sscanf(line, "%lf", &x) != 1);
        do {
            printf("Введите точность > 0 ");
            fflush(stdout);
        } while (fgets(line, sizeof line, stdin) == NULL
              || sscanf(line, "%lf", &eps) != 1
              || eps <= 0);
        x = fmod(x, 2 * acos(-1));
        s = 0;
        sl = x;
        for (z = 1; fabs(sl) >= eps; z++) {
            s += sl;
            sl = -sl * x * x / (2 * z * (2 * z + 1));
        }
        for (k = 0; eps < 1; eps *= 10, k++)
            ;
        printf("Сумма = %.*f\n", k, s);
        printf("Контрольное значение: %f\n", sin(x));
    } while (getchar() != EOF);
    return 0;
}
Код
[guest@localhost ex2_sin]$ ./sin
Программа вычисляет сумму ряда:
sin(x) = x - (x ^ 3) / 3! + (x ^ 5) / 5! - (x ^ 7) / 7! + ...
Введите x 1.5
Введите точность > 0 0.0001
Сумма = 0.9975
Контрольное значение: 0.997495
[guest@localhost ex2_sin]$
1
SKILHUNT
0 / 0 / 0
Регистрация: 10.10.2012
Сообщений: 14
12.10.2012, 18:34  [ТС] #21
Итак в данный момент я добился, что в роли eps у меня выступает n, то должно = количеству членов ряда а не точности, мб подкините идею как сделать?
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
#include <stdafx.h> 
#include <stdio.h>
#include <math.h>
 
double Cos(double x, double n)
{
   int i;
   double p, rez; 
   i = 0;
   rez = p = 1;
   while(fabs(p) >= n)
   {
       i += 2;
       p *= -(x*x)/((i-1)*i);
       rez += p;
   }
   return rez;
}
 
int main()
{
    double x,n,i;
    for(;;){
    printf("Vvedite x:\n");
    scanf_s("%lf", &x);
    printf("Vvedite n:\n");
    scanf_s("%lf",&n);
    if(n<=0)break;
    printf("n=%lf\nS=%lf\ncos(%lf) = %lf\n", n, Cos(x,n), x, cos(x));
    }
    }
Добавлено через 1 час 41 минуту
надо чтобы n задавался в виде 1 2 3 4...10, те просто цифрой
0
Thinker
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
12.10.2012, 19:52 #22
Цитата Сообщение от SKILHUNT Посмотреть сообщение
Итак в данный момент я добился

Не по теме:

взяли без зазрения совести мою функцию Cos из
Вычислить сумму ряда с определённой точностью,
а переделать ее для определенного количества слагаемых не можете, эх...

0
SKILHUNT
0 / 0 / 0
Регистрация: 10.10.2012
Сообщений: 14
12.10.2012, 19:56  [ТС] #23
я эту штуку и до этого находил, просто подтер в итоге, и нашел уже вашу версию, у меня в самом начале еще до отписывания на форум была попытка с таким же вариантом, так и не смог сделать как надо
0
Thinker
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
12.10.2012, 20:43 #24
посмотрите здесь оба варианта для экспоненты
exp(-40)
и сами попробуйте переделать для косинуса
1
SKILHUNT
0 / 0 / 0
Регистрация: 10.10.2012
Сообщений: 14
12.10.2012, 21:46  [ТС] #25
Ура, спасибо все за помощь, удалось сделать как надо, спс за совет про Visual studio, действительно не сравнить с Dev-c++, в конце столкнулся с проблемой, что rez возвращал непонятное число, за счет пошагового выполнения проги нашел где крылась ошибка, и в итоге все заработало как надо.
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 <stdafx.h> 
#include <stdio.h>
#include <math.h>
 
long double Cos(double x, double n)
{
   int i;
   long double p, rez;
   i=2;
   rez = p = 1;
   for(i=2;i<=n;i+=2){
       p *= (-(x*x)/((i-1)*i));
       rez += p;
   }
   return rez;
}
 
int main()
{
    double x,n;
    for(;;){
    printf("Vvedite x:\n");
    scanf_s("%lf", &x);
    printf("Vvedite n:\n");
    scanf_s("%lf",&n);
    if(n<=0)break;
    printf("\nn=%lf\nS=%lf\ncos(%lf) = %lf\n", n, Cos(x,n), x, cos(x));
    }
    }
0
accept
4825 / 3246 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
13.10.2012, 02:50 #26
свою добавлю ещё
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
#include <stdio.h>
#include <locale.h>
#include <math.h>
 
int main(void)
{
    double x, eps, s, sl;
    long z;
    short k;
    char line[100];
    
    if (setlocale(LC_ALL, "C") == NULL)
        fprintf(stderr, "Failed to set locale!\n");
    printf("Программа вычисляет сумму ряда:\n"
           "cos(x) = 1 - (x ^ 2) / 2! + (x ^ 4) / 4! - (x ^ 6) / 6! + ...\n");
    fflush(stdout);
    do {
        do {
            printf("Введите x ");
            fflush(stdout);
        } while (fgets(line, sizeof line, stdin) == NULL
              || sscanf(line, "%lf", &x) != 1);
        do {
            printf("Введите точность > 0 ");
            fflush(stdout);
        } while (fgets(line, sizeof line, stdin) == NULL
              || sscanf(line, "%lf", &eps) != 1
              || eps <= 0);
        x = fmod(x, 2 * acos(-1));
        s = 0;
        sl = 1;
        for (z = 0; fabs(sl) >= eps; z += 2) {
            s += sl;
            sl *= -x * x / ((z + 1) * (z + 2));
        }
        for (k = 0; eps < 1; eps *= 10, k++)
            ;
        printf("Сумма = %.*f\n", k, s);
        printf("Контрольное значение: %f\n", cos(x));
    } while (getchar() != EOF);
    return 0;
}
Код
[guest@localhost c]$ .ansi -lm cos.c -o cos
[guest@localhost c]$ ./cos
Программа вычисляет сумму ряда:
cos(x) = 1 - (x ^ 2) / 2! + (x ^ 4) / 4! - (x ^ 6) / 6! + ...
Введите x 1.2
Введите точность > 0 0.0001
Сумма = 0.3624
Контрольное значение: 0.362358
[guest@localhost c]$
0
13.10.2012, 02:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.10.2012, 02:50
Привет! Вот еще темы с ответами:

Вычислить сумму первых N членов ряда - C++
Вычислить сумму первых N членов ряда, значения N и x ввести с клавиатуры. (C++) Уже есть код, но результат получается неправильный....

Вычислить сумму первых N членов ряда, значения N и x ввести с клавиатуры - C++
помогите пожалуйста

Вычислить сумму первых N членов ряда, значения N и x ввести с клавиатуры - C++
y= sinx+1/1 + sinx+2/1+3 + sinx+3/1+3+1 + sinx+4/1+3+1+3 +... Контрольное значение: y = 6.0069 при x=1.38 и N=7 Контрольное...

определить число членов ряда, необходимых для расчета с заданной погрешностью суммы членов ряда: - C++
определить число членов ряда, необходимых для расчета с заданной погрешностью суммы членов ряда: 1-1/3+1/5-1/7+…..: (-1)^N/(2*N+1);...


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

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru