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;
- }
- }
- // Получение точности рассчета
- bool Prod()
- {
- cout << "Continue Y/N" << endl;
- char yn;
- cin >> yn;
- cin.clear();
- if (yn == 'Y' && cin.get() == '\n') return true;
- else if (yn == 'N' && cin.get() == '\n') return false;
- else
- {
- while (cin.get() != '\n');
- cout << "Error. Try again" << endl;
- Prod();
- }
- }
- // Продолжение работы программы
- 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;
- }
- // Поиск
- int main()
- {
- vector<double> savedValue;
- do {
- cout << "Enter a value for x and a" << endl;
- int savedCount = 0;
- int countIteration = 0;
- int x, lastX = 0;
- double alpha;
- double epsilon;
- double sum = 0;
- double lastValue;
- cout << "x: ";
- cin >> x;
- if (x != lastX) {
- savedValue.clear();
- lastEpsilon.clear();
- sum = 0;
- lastX = x;
- }
- cout << "a: ";
- cin >> alpha;
- // Ввод параметра x и значения альфа
- int size = savedSum.size();
- if (alpha >= 1)
- {
- if (alpha <= size) {
- output(alpha - 1, savedSum[size - 1], savedValue[size - 1], lastEpsilon[size - 1]);
- }
- // Если число слагаемых мельше сохраненного значения, то выведем сохраненные значения
- else
- {
- 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;//lastEpsilon[lastEpsilon.size() - 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);
- }
- }
- // Если не сохранено значений для вектора, то посчитать и вывести их
- } while (Prod());
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement