10 / 10 / 1
Регистрация: 13.12.2014
Сообщений: 87

Задание по ряду Тейлора: cosh(x)

18.12.2014, 00:54. Показов 2181. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброй ночи) Люди добрые, помогите, пожалуйста с программой.
Задание заключается в выведении таблиц со значениями различных переменных. Моя функция - cosh(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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include "math.h"
#include <locale.h>
#include <conio.h>
#include <iostream>
#include "string"
 
using namespace std;
 
double myCosh(int n, double x, long double f)
{
    double cosh;
    cosh = 1 / f;
    cosh = cosh * (pow(x, (2 * n)));
    return cosh;
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
    double m, xMin, xMax, dx, eps, MyF, Cosh, xIdeal;
    cout << "Введите eps=";
    cin >> eps;
    cout << "Введите xMin=";
    cin >> xMin;
    cout << "Введите xMax=";
    cin >> xMax;
    cout << "Введите dx=";
    cin >> dx;
    while (((dx <= 0) && ((xMax - xMin) > 0)) || ((dx >= 0) && ((xMax - xMin) < 0)))
    {
        cout << "\n Ошибка!  \n dx = ";
        cin >> dx;
    }
    m = (xMax - xMin) / dx;
    if (((xMax - xMin) == 0) && (dx == 0))
    {
        m = 0;
    }
    cout << "\nТаблица1\n";
    cout << " _______________________________________________________________________\n";
    cout << "|      x      |   MyFunction(x)   |   Function(x)    |        б        |\n";
    cout << "|_____________|___________________|__________________|_________________|\n";
 
    for (double x = xMin, n = 1; n <= floor(m) + 1; x = x + dx, n++)
    {
        double b, p = 1;
        MyF = 0;
        long double f = 1;
        int i = 1;
        for (double n = 0; fabs(p) >= eps; n++)
        {
            Cosh = cosh(x);
            MyF = MyF + myCosh(n, x, f);
            p = myCosh(n + 1, x, f) - myCosh(n, x, f);
            f = f*i;
            i++;
        }
        b = sqrt(abs((MyF*MyF) - (Cosh*Cosh)));
        printf("| %10.7f  |%14.7lg     |%14.7lg    |%14.7lg   |\n", x, MyF, Cosh, b);
 
    }
    cout << "|_____________|___________________|__________________|_________________|\n";
 
    cout << "Введите xIdeal=";
    cin >> xIdeal;
    cout << "\nТаблица2\n";
    cout << " ____________________________________________________________________\n";
    cout << "|    eps    |   MyFunction(x)   |   Function(x)    |        б        |\n";
    cout << "|___________|___________________|__________________|_________________|\n";
 
    for (eps = 0.1; eps >= 0.0000001; eps = eps / 10)
    {
        double b, p = 1;
        MyF = 0;
        long double f = 1;
        int i = 1;
        for (double d = 0; fabs(p) >= eps; d++)
        {
            Cosh = cosh(xIdeal);
            MyF = MyF + myCosh(d, xIdeal, f);
            p = myCosh(d + 1, xIdeal, f) - myCosh(d, xIdeal, f);
            f = f*i;
            i++;
        }
 
        b = sqrt(abs((MyF*MyF) - (Cosh*Cosh)));
        printf("| %8.7f |%15.7lg    |%15.7lg   |%15.7lg  |\n", eps, MyF, Cosh, b);
 
    }
 
    cout << "|___________|___________________|__________________|_________________|\n";
    system("pause");
    return 0;
}
Причина вывода неправильных зрначений, насколько я понял - вот этот участок:

C++
1
2
3
4
5
6
7
8
9
10
11
12
double b, p = 1;
        MyF = 0;
        long double f = 1;
        int i = 1;
        for (double n = 0; fabs(p) >= eps; n++)
        {
            Cosh = cosh(x);
            MyF = MyF + myCosh(n, x, f);
            p = myCosh(n + 1, x, f) - myCosh(n, x, f);
            f = f*i;
            i++;
        }
Но, что тут может пойти не так - я просто не могу понять. Надеюсь на вашу помощь.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.12.2014, 00:54
Ответы с готовыми решениями:

Вычисление cosh разложением в ряд Тейлора
Добрый вечер. Прошу помочь с программой на C++ в VS2013. Тема такая. Есть программа (ниже). Она работает. Задача выводить две таблицы со...

Вычисление функций cosh разложением в ряд Тейлора
Добрый день, у меня простая вроде бы задачка, но я не понимаю как 2 части одного задания объединить в одну прогу.. &quot;Вычислить...

Задача по ряду Тейлора
я все время работал в Basic и понятия не имею как пользоваться командами C++. прошу вас, помогите! Формат входных данных. Ввод:...

3
 Аватар для D_in_practice
343 / 343 / 331
Регистрация: 02.10.2014
Сообщений: 666
18.12.2014, 07:35
Лучший ответ Сообщение было отмечено Michael_Nexus как решение

Решение

У Вас проблема с разложением в ряд Тейлора, нельзя использовать обычную формулу при вычислениях с факториалом, нужо избавиться от нее.
https://www.cyberforum.ru/cgi-bin/latex.cgi?ch(x) = \sum_{k=0}^{inf}\frac{{x}^{2k}}{(2k)!}

https://www.cyberforum.ru/cgi-bin/latex.cgi?ak= \frac{{x}^{2k}}{(2k)!}

https://www.cyberforum.ru/cgi-bin/latex.cgi?a0= \frac{{x}^{2*0}}{(2*0)!} = 1

https://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{k} = \frac{{x}^{2}*{a}_{k-1}}{2k(2k-1)}

Не понял что у Вас за "xIdeal", (точнее как с наскока его быстро реализовать).
Поэтому даю свой код, судя по Вашему коду, Вы легко разберетесь
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
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
 
double myCosh(double x, double eps)
{
    double ak = 1;
    double sum = ak;
    for (int k = 1; fabs(ak) > eps; ++k){
        
        ak *= x*x/(2*k*(2*k - 1));
        sum += ak;
    }
    
    return sum;
}
 
int main(){
    
    for (double x = -1; x < 1 + 0.05; x += 0.1){
        cout << setw(5) << fixed << setprecision(1) << x;
        cout << setw(15) << fixed << setprecision(4) << cosh(x);
        cout << setw(15) << fixed << setprecision(4) << myCosh(x, 0.001) << endl;
    }
}
Или так
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
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
 
double myCosh(int n, double x)
{
    double ak = 1;
    double sum = ak;
    for (int k = 1; k <= n; ++k){
        
        ak *= x*x/(2*k*(2*k - 1));
        sum += ak;
    }
    
    return sum;
}
 
int main(){
    
    for (double x = -1; x < 1 + 0.05; x += 0.1){
        cout << setw(5) << fixed << setprecision(1) << x;
        cout << setw(15) << fixed << setprecision(4) << cosh(x);
        cout << setw(15) << fixed << setprecision(4) << myCosh(100, x) << endl;
    }
}
2
10 / 10 / 1
Регистрация: 13.12.2014
Сообщений: 87
19.12.2014, 03:09  [ТС]
D_in_practice, спасибо большое! Попробую реализовать.
А xIdeal - это любое выбранное значение x, при котором значение функции cosh(x) (тут все будут равны) и значение ряда будут сравниваться. Отличаются они точностью - eps, значение которой мы задаем от 0.1 до 10^(-7).

Добавлено через 14 часов 47 минут
D_in_practice, немного изменил код вот так.

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
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
 
double myCosh(int n, double x)
{
    double ak = 1;
    double sum = ak;
    for (int k = 1; k <= n; ++k){
 
        ak *= x*x / (2 * k*(2 * k - 1));
        sum += ak;
    }
 
    return sum;
}
 
int main()
{
    double n, sigma, Cosh, x, MyF;
    cout << "Enter n"<< endl;
    cin >> n;
    
    for (double x = -1; x < 1 + 0.05; x += 0.1)
    {
        Cosh = cosh(x);
        MyF = myCosh(n, x);
        sigma = sqrt(abs((MyF*MyF) - (Cosh*Cosh)));
        cout << setw(5) << fixed << setprecision(1) << x;
        cout << setw(15) << fixed << setprecision(4) << Cosh;
        cout << setw(15) << fixed << setprecision(4) << MyF;
        cout << setw(15) << fixed << setprecision(4) << sigma << endl;
    }
    system("pause");
}
Вроде все работает, но можете подсказать, почему при вводе погрешности (т.е. n) меньше единицы все значения соответствующего ряда (MyF) становятся равными единицей? То есть программа почему-то полностью обнуляет все иксы и оставляет только единицу. Что не так, подскажите, пожалуйста!

Добавлено через 9 минут
Понял. Из-за этого.
C++
1
for (int k = 1; k <= n; ++k)
Потому что k просто не может быть больше n.
Теперь другой вопрос. Скажите, как это можно исправить? Чтобы при вводе погрешости от нуля до единицы MyF выводилась нормально?

Добавлено через 53 минуты
Прошу прощения, что так быстро себе же и отвечаю. В общем, со всем разобрался. Использовал ваш первый пример для программы. Еще раз большое спасибо =)
0
 Аватар для D_in_practice
343 / 343 / 331
Регистрация: 02.10.2014
Сообщений: 666
19.12.2014, 10:49
Michael_Nexus, я написал две программы, первая вычисляет до определенной погрешности eps
вторая до нужного члена суммы.
Когда Вы вводите n < 1, программа преобразует его к целому типу и n = 0.
Нулевой член равен 1.
Хотите использовать eps берите первый код
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.12.2014, 10:49
Помогаю со студенческими работами здесь

Расчет синуса и косинуса по ряду Тейлора
помогите посчитать синус и косинус с помощью ряда Тейлора Как я понимаю синус и косинус это тип double? т.е там должно быть 13 знаков...

Разложение функции по ряду Тейлора: x*cos(3x)
Добрый вечер, ребята. Помогите, пожалуйста, разложить функцию x*cos(3x) по ряду Тейлора. Например, как кошинус. double FuncCosh(double...

Поясните алгоритм вычисления синуса по ряду Тейлора
void sinus1(int x1) { float a, s1; a = x1; s1 = x1; for (int i = 1; i &lt;= 15; i++) { a = -a*x1*x1 / (2 *...

Составить программу, которая вычисляет значение функции по ряду Тейлора
http://vk.com/photo128030286_332126241?rev=1 http://vk.com/photo128030286_332126262?rev=1

Функция по ряду Тейлора
Нужно вычислить и вывести на экран в виде таблицы значения функции F(x), на интервале от Хнач. до Хкон. с шагом dX с точностью до Ɛ. ...


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

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

Новые блоги и статьи
Генераторы Python для эффективной обработки данных
AI_Generated 21.05.2025
В Python существует инструмент настолько мощный и в то же время недооценённый, что я часто сравниваю его с тайным оружием в арсенале программиста. Речь идёт о генераторах — одной из самых элегантных. . .
Чем заменить Swagger в .NET WebAPI
stackOverflow 21.05.2025
Если вы создавали Web API на . NET в последние несколько лет, то наверняка сталкивались с зелёным интерфейсом Swagger UI. Этот инструмент стал практически стандартом для документирования и. . .
Использование Linq2Db в проектах C# .NET
UnmanagedCoder 21.05.2025
Среди множества претендентов на корону "идеального ORM" особое место занимает Linq2Db — микро-ORM, балансирующий между мощью полноценных инструментов и легковесностью ручного написания SQL. Что. . .
Реализация Domain-Driven Design с Java
Javaican 20.05.2025
DDD — это настоящий спасательный круг для проектов со сложной бизнес-логикой. Подход, предложенный Эриком Эвансом, позволяет создавать элегантные решения, которые точно отражают реальную предметную. . .
Возможности и нововведения C# 14
stackOverflow 20.05.2025
Выход версии C# 14, который ожидается вместе с . NET 10, приносит ряд интересных нововведений, действительно упрощающих жизнь разработчиков. Вы уже хотите опробовать эти новшества? Не проблема! Просто. . .
Собеседование по Node.js - вопросы и ответы
Reangularity 20.05.2025
Каждому разработчику рано или поздно приходится сталкиватся с техническими собеседованиями - этим стрессовым испытанием, где решается судьба карьерного роста и зарплатных ожиданий. В этой статье я. . .
Cython и C (СИ) расширения Python для максимальной производительности
py-thonny 20.05.2025
Python невероятно дружелюбен к начинающим и одновременно мощный для профи. Но стоит лишь заикнуться о высокопроизводительных вычислениях — и энтузиазм быстро улетучивается. Да, Питон медлительнее. . .
Безопасное программирование в Java и предотвращение уязвимостей (SQL-инъекции, XSS и др.)
Javaican 19.05.2025
Самые распространёные векторы атак на Java-приложения за последний год выглядят как классический "топ-3 хакерских фаворитов": SQL-инъекции (31%), межсайтовый скриптинг или XSS (28%) и CSRF-атаки. . .
Введение в Q# - язык квантовых вычислений от Microsoft
EggHead 19.05.2025
Microsoft вошла в гонку технологических гигантов с собственным языком программирования Q#, специально созданным для разработки квантовых алгоритмов. Но прежде чем погружаться в синтаксические дебри. . .
Безопасность Kubernetes с Falco и обнаружение вторжений
Mr. Docker 18.05.2025
Переход организаций к микросервисной архитектуре и контейнерным технологиям сопровождается лавинообразным ростом векторов атак — от тривиальных попыток взлома до многоступенчатых кибератак, способных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru