Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 20.12.2015
Сообщений: 7

Вычисление приближенного значения tan(x) через ряд Тейлора/ряд Маклорена

20.12.2015, 21:26. Показов 4639. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет, CF.
Задача: Вычисление приближенного значения tan(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
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
#include <iostream>
#include <math.h>
#include <iomanip>
#include <omp.h>
#define  PI          3.14159265358979323846
double tgx(double); //функция, высчитывающая тангенс
long long  fact(int); //факториал
double vetBern(double); // числа Бернулли
 
int main() {
    int n;
    std::cin >> n;
    double start = omp_get_wtime();
    double Result = tgx((n * PI) / 180);
    double end = omp_get_wtime() - start;
    std::cout << std::fixed << std::setprecision(7) << " result = " << Result << std::endl;
    std::cout << "elapsed time = " << end << std::endl;
 
    return 0;
}
 
double tgx(double x)
{
    double z = 0.0;
    int i;
    if (fabs(x) < PI / 2) {
        for (i = 1; i < 14; i++)
        {
            //это ряд Тейлора z += vetBern(2 * i) *  ((pow(2, 2 * i)) * (pow(2, (2 * i)) - 1)  * pow(x, (2 * i) - 1)) / fact(2 * i);
            z += (vetBern(2 * i) * pow(-4, i) * (1 - pow(4, i)) * pow(x, ((2 * i) - 1))) / fact(2 * i);// ряд Маклорена
            std::cout << z << std::endl;
        }
    }
    else std::cout << " Wrong variable" << std::endl;
    return z;
}
 
long long fact(int  x) { // факториал
    if (x == 0 && x == 1)
        return 1;
    else {
 
        long long result = 1;
        for (int i = 2; i <= x; i++) {
            result *= i;
        }
        return result;
    }
}
 
 
double vetBern(double n)// расчет чисел Бернулли
{
    static_cast<int>(n);
    double bern = 1.0;
    double sum;
    if (n == 0)
    {
        sum = 1.0;
    }
    else
    {
        sum = 0.0;
        for (int k = 1; k <= n;k++)
        {
            sum += ((fact(k + 1) / (fact(n + 1)*fact(k - n))) * vetBern(n - k));
        }
        bern = ((-1) / (n + 1)) * sum;
    }
    return fabs(bern);
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.12.2015, 21:26
Ответы с готовыми решениями:

Вычисление функции через разложение в ряд (Ряд Тейлора)
Привет всем. Задание такого плана: Вычислить и вывести на экран в виде таблицы значения функции, заданной с помощью ряда Тейлора,...

Вычисление значения функции разложением в ряд Тейлора
Помогите, пожалуйста, составить программу на C++ для вычисления суммы бесконечного ряда с погрешностью, заданной пользователем с клавиатуры.

Вычисление значения функции разложением в ряд Тейлора: 1/(1 + x)
Составьте программу вычисления значения суммы Y(x) и функции f(x), для |x|&lt;1. Выведите на экран таблицу значений функции f(х) и ее...

6
505 / 317 / 236
Регистрация: 18.02.2013
Сообщений: 754
20.12.2015, 21:43
long long дает целое число -> целое/целое=целое
0
0 / 0 / 0
Регистрация: 20.12.2015
Сообщений: 7
20.12.2015, 21:56  [ТС]
Сделал факториал не int, а double - результат еще отдалился от истины.
Как правильнее было бы типы привести?
0
505 / 317 / 236
Регистрация: 18.02.2013
Сообщений: 754
20.12.2015, 22:21
double подхолит
может так
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
double vetBern(double n)// расчет чисел Бернулли
{
    static_cast<int>(n);
   
    double *ber=new int n;
     double bern = 1.0;
     ber[0]=1;
    double sum;
    if (n == 0)
    {
        sum = 1.0;
    }
    else
    {
        sum = 0.0;
        for (int k = 1; k < n;k++)
        {
            sum += ((-1) / (n + 1)) * ((fact(k + 1) / (fact(n + 1)*fact(k - n))) * ber[n - k]);
            ber[k]=sum;
            
        }
       // bern = sum;
    }
    delete []ber;
    return sum;
}
1
0 / 0 / 0
Регистрация: 09.10.2017
Сообщений: 12
23.02.2020, 01:42
Не работает. Бредовый код...
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,536
Записей в блоге: 1
23.02.2020, 02:37
Факториалы в этой формуле не нужны. Думайте как программист, а не как математик.
0
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,930
Записей в блоге: 5
23.02.2020, 05:57
Вы очень неэффективно вычисляете. Зачем вы вычисляете одно число Бернулли, если вам требуется их последовательность? Для вычисления одного вам придется вычислять все предыдущие, и так рекурсивно. Это же факториальный рост объема вычислений. Вам предписано вычислять именно по этому алгоритму? На каком интервале и какую точность должна давать ваша программа? Какие временные ограничения? Вы проверяли отдельно вычисленные коэффициенты ряда? Их можно сравнить с табличными. Как зависит ваша погрешность от x? При x близким к пи/2 погрешность должна быть большой.

Добавлено через 35 минут
Вы число сочетаний при вычислении чисел Бернулли неправильно вычисляете. В числителе должен стоять (n+1)! а в знаменателе (k+1)! (n-k)! Вычислите несколько первых чисел Бернулли и сравните с табличными. Хотя число сочетаний вычислять через факториалы это та еще разруха в головах. С факториалами может случиться переполнение даже у long long.
. . .
О, посчитал. Вот смотрите, первое число это 28! а второе 2^64. А у вас ряд считается до i=14, то есть вам потребуется вычислять B28.
304888344611713860501504000000
18446744073709551616
Поищите по форуму, как надо правильно вычислять число сочетаний.

Добавлено через 18 минут
Вот как вычисляется https://www.cyberforum.ru/cgi-bin/latex.cgi?C_{28}^{14}. Все переменные могут быть int.
C++
1
2
3
4
5
p = 1;
for(i = 1; i <= 14; ++i) {
    p *= 29 - i;
    p /= i;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.02.2020, 05:57
Помогаю со студенческими работами здесь

Вычисление значения функции разложением в ряд Тейлора
Рассчитать сумму членов бесконечного ряда с заданной пользователем точностью е для заданного пользователем значения x є (-1;1) :...

Вычисление значения функции разложением в ряд Тейлора
Составить программу для вычисления суммы ряда с точностью \varepsilon. Под приближенными значениями суммы ряда с точностью \varepsilon,...

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

Вычисление значения функции разложением в ряд Тейлора
Доброго времени суток,помогите пожалуйста написать программу.Ломал голову все не как не получается Вычислить с точностью eps&gt;0: ...

Вычисление значения функции разложением в ряд Тейлора: ln(1 + x)
Дано вещественное число X (|X| &lt; 1) и целое число N &gt; 0. Написать функцию для вычисления суммы Σ = x - x2/2 + x3/3 - ... +...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru