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

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

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

Author24 — интернет-сервис помощи студентам
Доброй ночи) Люди добрые, помогите, пожалуйста с программой.
Задание заключается в выведении таблиц со значениями различных переменных. Моя функция - 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.12.2014, 00:54
Ответы с готовыми решениями:

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

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

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

Расчет синуса и косинуса по ряду Тейлора
помогите посчитать синус и косинус с помощью ряда Тейлора Как я понимаю синус и косинус это тип...

3
343 / 343 / 331
Регистрация: 02.10.2014
Сообщений: 666
18.12.2014, 07:35 2
Лучший ответ Сообщение было отмечено 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  [ТС] 3
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
343 / 343 / 331
Регистрация: 02.10.2014
Сообщений: 666
19.12.2014, 10:49 4
Michael_Nexus, я написал две программы, первая вычисляет до определенной погрешности eps
вторая до нужного члена суммы.
Когда Вы вводите n < 1, программа преобразует его к целому типу и n = 0.
Нулевой член равен 1.
Хотите использовать eps берите первый код
1
19.12.2014, 10:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.12.2014, 10:49
Помогаю со студенческими работами здесь

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

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

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

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

Задача по ряду Тейлора
Добрый день, нужно решить задачу по примеру. Задача: Вычислить и вывести на экран в виде таблицы...

График по ряду Тейлора
Добрый вечер. Нужна помощь в построение графика по ряду Тейлора. Построение сетки я тут нашел:...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru