Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Лабораторная работа для Безуса № 2
- #include <iostream>
- #include <cmath>
- #include <vector>
- #define PI 3.1415
- using namespace std;
- // Рассчет факториала
- double factorial(int n)
- {
- if (n == 0) return 1;
- else return n * factorial(n - 1);
- }
- // Рассчет последнего значения функции
- double getValue(int n, int x)
- {
- return (pow(2, (n / 2)) * cos((PI * n) / 4) * pow(x, n)) / factorial(n);
- }
- // Получение точности рассчета
- vector<double> lastEpsilon;
- double InputEpsilon(int n, int x, double sum)
- {
- if (lastEpsilon.size() > n)
- return lastEpsilon[n];
- else {
- double epsilon = abs((getValue(n + 1, x)) / sum);
- lastEpsilon.push_back(epsilon);
- return epsilon;
- }
- }
- // Получение суммы значений
- vector<double> savedSum;
- double getSum(int n, double x) {
- if (savedSum.size() > n) {
- return savedSum[n];
- }
- else
- {
- double sum = 0;
- if (savedSum.size() > 0)
- sum = savedSum[n - 1];
- sum += getValue(n, x);
- savedSum.push_back(sum);
- return sum;
- }
- }
- // Метод вывода всех значений
- void output(int countIteration, double sum, double lastValue, double epsilon) {
- cout << "Iteration: " << countIteration << endl;
- cout << "Sum: " << sum << endl;
- cout << "Last Value: " << lastValue << endl;
- cout << "Epsilon: " << epsilon << endl;
- }
- // Поиск значения Эпсилон для введенного альфа
- int searchIndexEpsilon(vector<double> vector, double searchItem)
- {
- for (int i = 0; i < vector.size(); i++)
- {
- if (vector[i] <= searchItem)
- return i;
- }
- return -1;
- }
- // Ввод x
- double inputX() {
- int x;
- cout << "x: ";
- cin >> x;
- cin.clear();
- if (cin.get() != '\n') {
- while (cin.get() != '\n');
- cout << "Error inputing! try again" << endl;
- return inputX();
- }
- return x;
- }
- // Ввод альфа
- double inputA() {
- double a;
- cout << "a: ";
- cin >> a;
- cin.clear();
- if (cin.get() != '\n') {
- while (cin.get() != '\n');
- cout << "Error inputing! try again" << endl;
- return inputA();
- }
- return a;
- }
- int main()
- {
- vector<double> savedValue;
- cout << "Enter a value for x and a" << endl;
- int lastX = 0;
- double epsilon;
- double sum = 0;
- double lastValue;
- // Ввод параметра x и значения альфа
- double x = inputX();
- double alpha = inputA();
- int size = savedSum.size();
- // Если второе число больше 1, то принимаем его за число слагаемых ряда для суммирования
- if (alpha >= 1)
- {
- for (int i = size; i < alpha; i++)
- {
- lastValue = getValue(i, x);
- sum = getSum(i, x);
- epsilon = InputEpsilon(i, x, sum);
- output(size, sum, lastValue, epsilon);
- }
- }
- // Если введенное альфа меньше 1
- else
- {
- int savedIndex = searchIndexEpsilon(lastEpsilon, alpha);
- int currentEpsilon = 1;
- if (savedIndex == -1)
- {
- while (currentEpsilon > alpha)
- {
- lastValue = getValue(savedValue.size(), x);
- sum = getSum(savedSum.size(), x);
- currentEpsilon = InputEpsilon(lastEpsilon.size(), x, sum);
- output(lastEpsilon.size() - 1, sum, lastValue, currentEpsilon);
- }
- }
- }
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement