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

Программно-алгоритмический реализация расписания функции в ряд Тейлора - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Разработать алгоритм и программу для разбиения текста на строки (как признак конца строки в тексте использовать символ @) http://www.cyberforum.ru/cpp-beginners/thread898889.html
Разработать алгоритм и программу для разбиения текста на строки (как признак конца строки в тексте использовать символ @). помогите для зачета надо на С++
C++ Разработать алгоритм и программу для удаления в заданном тексте части текста, взятого в скобки (вместе со скобками) Разработать алгоритм и программу для удаления в заданном тексте части текста, взятого в скобки (вместе со скобками).Помогите плиз для зачета на С++ http://www.cyberforum.ru/cpp-beginners/thread898887.html
Дан входной текстовый файл, строка S (вводится с клавиатуры). Записать в выходной файл все строки входного файла, содержащие в качестве фрагмента стро C++
Дан входной текстовый файл, строка S (вводится с клавиатуры). Записать в выходной файл все строки входного файла, содержащие в качестве фрагмента строку S. Добавлено через 15 часов 34 минуты ну...
Программно-алгоритмический реализация разложения функции в ряд Тейлора C++
Программно-алгоритмический реализация разложения функции в ряд Тейлора» заключается в проведении программной реализации расчета приблизительного значения функции "у", разложив функцию f (x) в ряд...
C++ Лишнее считывание строк http://www.cyberforum.ru/cpp-beginners/thread898865.html
Всем доброго вечера! Как всегда, избитая тема про потоки cin/cout. Предположим, в следующем формате пишется часть кода: cout << "Enter the number of books:\n"; cin >> k; // int k ...
C++ упорядочить по четности Пусть задана матрица. Рассматривая ее как вектор строк, упорядочите ее по количеству нечетных элементов в каждой строке #pragma argsused #include <iostream.h> #include <cmath> #include... подробнее

Показать сообщение отдельно
UranFlex
131 / 129 / 21
Регистрация: 25.05.2013
Сообщений: 233
15.06.2013, 02:10
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
//============================================================================
// Name        : taylor.cpp
// Author      : UranFlex
// Version     : 0.1 alpha
// Copyright   : GNU GPL
// Description : Задания расчетно-графической работы «Программно-алгоритмическая реализация расписания функции в ряд Тейлора»
//               заключается в проведении программной реализации расчета приблизительного значения функции y, разложив функцию f (x) в ряд Тейлора,
//               при этом необходимо вывести и применить рекуррентное отношение для расчета общей части для каждого слагаемого ряда или его части.
//               Исходными параметрами задач является аргумент функции, изменяется в диапазоне [ xBegin, xEnd ] с шагом xDelta,
//               и точность (допустимая погрешность) расчетов epsilon, определяющая условие завершения рекурсивного расчета.
//               Примечание 1 : Функция cos^2( x ) и ряд Тейлора в графическом файле.
//               Примечание 2 : Вводимые xBegin и xEnd - это значения в радианной мере.
//               Примечание 3 : cos^2( pi / 2 ) == 0 - хоть это и так, все же если попытаться выполнить следующий оператор
//                  cout << cos( M_PI_2 ) * cos( M_PI_2 ) << endl; - то в выводе мы не увидим просто 0.
//                  А увидим мы очень маленькое число и очень близкое к 0. Т.е. почти 0.
//                  Это особенность иррациональных чисел вроде числа ПИ, а также особенность представления чисел в памяти компьютера.
//                  В связи с этими особенностями и использованы манипулятор потока setprecision и флаг форматирования fixed.
//               C++, Ansi-style
//============================================================================
 
#include <iostream>
#include <cmath>
#include <iomanip>
 
using namespace std;
// функция считает факториал целого числа
long double Fact( long n );
// функция считает приближенно cos^2( x ) при помощи ряда Тейлора
// - значение x
// - точность вычислений
// - флаг, который определяет рекурсивно ли вызвана функция или впервые для данного x
long double Calc( long double x, const long double e, bool flagNew = true);
 
int main() {
 
     double xBegin, xEnd; // начальное и конечное значения x
     unsigned count; // количество вычисляемых значений на отрезке от начального до конечного значения x [ xBegin, xEnd ]
     double epsilon; // точность вычисления
 
     // запрашиваем у пользователя исходные данные
     cout << "Введите начальное и конечное значения x ( в радианах )" << endl;
     cin >> xBegin >> xEnd;
 
     cout << "Введите количество вычисляемых значений" << endl;
     cin >> count;
 
     cout << "Введите точность вычислений" << endl;
     cin >> epsilon;
 
     const double xDelta = ( xEnd - xBegin ) / ( count - 1 ); // находим шаг для вычислений
     cout << "Шаг для вычислений " << xDelta << "( радиан )" << endl;
 
     // в цикле вызываем функцию для рассчета очередного значения начиная с xBegin и заканчивая xEnd - xDelta элементом
     for ( unsigned i = 0; i < count - 1; ++i )
     cout << "X" << i + 1 << " = " << setprecision( 3 ) << Calc( xBegin + xDelta * i, epsilon ) << endl;
 
     // значение функции Calc( xEnd ) я решил вычислить отдельно, так как работаю с плавающей точкой
     // и при суммировании в цикле может быть неточность при вычислении граничного значения xEnd.
     cout << "X" << count << " = " << setprecision( 3 ) << fixed << Calc( xEnd, epsilon ) << endl;
 
 
    return 0;
}
 
long double Calc( long double x, const long double e, bool flagNew ) {
    static long double p; // степень
    static int koef; // для знака + или -
    // если функцию вызвали в первый раз - т.е. нерекурсивно
    if ( flagNew ){ // то устанавливаем начальные значения степени и коэффициента
        koef = 1;
        p = 2.0;
    }
    // для того чтобы в следующем операторе в вычислениях с правой стороны от знака "="
    // поменять знак очереднго элемент ряда на противоположенный знаку, который был в пердыдущем вычислении
    koef *= -1;
 
    // вычисляем очередной элемент ряда
    long double res = ( pow( x, p ) * pow( 2.0L, p - 1 ) / Fact( p ) ) * koef;
 
    // проверка на окончание рекурсии
    if ( fabs( res ) <= e ) // если очередной элемент ряда по модулю менее или равен epsilon
        return 1 + res; // то возвращаем значение и прерываем рекурсию
    else { // а если не
        p += 2.0; // то увеличиваем степень
        // прибавляем к очередному элементу ряда следующий элемент ряда, который будет вычислен рекурсивно
        return res + Calc( x, e, false );
    }
 
}
 
long double Fact( long n ) {
    return n > 0 ? n * Fact( n - 1 ) : 1;
}
Примеры работы программы.
1.
Кликните здесь для просмотра всего текста
Введите начальное и конечное значения x ( в радианах )
0
1.57079632679
Введите количество вычисляемых значений
2
Введите точность вычислений
0.01
Шаг для вычислений 1.5708( радиан )
X1 = 1
X2 = 0.000


2.
Кликните здесь для просмотра всего текста
Введите начальное и конечное значения x ( в радианах )
0
6.28318530718
Введите количество вычисляемых значений
10
Введите точность вычислений
0.0001
Шаг для вычислений 0.698132( радиан )
X1 = 1
X2 = 0.587
X3 = 0.0302
X4 = 0.25
X5 = 0.883
X6 = 0.883
X7 = 0.25
X8 = 0.0302
X9 = 0.587
X10 = 1.000


3. ( с низкой точностью )
Кликните здесь для просмотра всего текста
Введите начальное и конечное значения x ( в радианах )
-3.14159265359
0
Введите количество вычисляемых значений
13
Введите точность вычислений
0.1
Шаг для вычислений 0.261799( радиан )
X1 = 0.998
X2 = 0.937
X3 = 0.743
X4 = 0.499
X5 = 0.253
X6 = 0.0613
X7 = -0.000915
X8 = 0.069
X9 = 0.246
X10 = 0.5
X11 = 0.751
X12 = 0.931
X13 = 1.000


Пояснение к примерам
Кликните здесь для просмотра всего текста
1.57079632679 = π / 2
6.28318530718 = 2 * π
3.14159265359 = π
2
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru