Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cmath>
- #include <iostream>
- #include <iomanip>
- using namespace std;
- void inputdata(double* a, double* b, double* h, double* esp);
- double function(double x);
- double function_2(double x);
- double Dfunction_2(double x);
- double function_3(double x);
- double Dfunction_3(double x);
- double Wegstein(double(*f)(double), double x0, double x1, double eps, int& i_counter);
- double New(double(*function_2)(double), double (*Dfunction_2)(double), double x0, double eps, int& i_counter);
- double Sec(double(*function_2)(double), double x1, double eps, int& i_counter);
- int main()
- {
- double a = 0, b = 0, h = 0, esp = 0, x = 0;
- int counter = 0, i_counter = 0;
- setlocale(LC_ALL, "ru");
- cout << "1 - x^3 + 10*x^2 - 50 методом Вегстейна" << " По умолчанию: a = -12, b = 5, h = 0.1, esp = 0.01" << endl;
- cout << "2 - log(x) - 5 * cos(x) методом секущих" << " По умолчанию: a = 1, b = 8, h = 0.1, esp = 0.01" << endl;
- cout << "3 - x^3 + 5x^2 + 12 методом Ньютона" << " По умолчанию: a = -2, b = 5, h = 0.1, esp = 0.01" << endl;
- cout << "Выберите функцию: " << endl;
- char action;
- cin >> action;
- if (action == '1')
- {
- cout << "Использовать значения по умолчанию(1), ввести вручную" << endl;
- char symbol; cin >> symbol;
- if (symbol == '1')
- a = -12, b = 5, h = 0.1, esp = 0.01;
- else
- inputdata(&a, &b, &h, &esp);
- cout << "Корни\tЗначение х \tКорень \t Кол-во итераций" << endl;
- double i = a;
- while (i <= b)
- {
- if (function(i) * function(i + h) < 0)
- {
- counter++;
- x = Wegstein(function, i, i + h, esp, i_counter);
- cout << setw(4) << counter << setw(10) << i << setw(17) << x << setw(10) << i_counter << endl;
- }
- i += h;
- }
- if (counter == 0)
- cout << "На данном отрезке корней нет!";
- }
- else if (action == '2')
- {
- cout << "Использовать значения по умолчанию(1), ввести вручную" << endl;
- char symbol; cin >> symbol;
- if (symbol == '1')
- a = 1, b = 8, h = 0.1, esp = 0.001;
- else
- inputdata(&a, &b, &h, &esp);
- double i2 = a;
- cout << "Корни\tЗначение х \tКорень \t Кол-во итераций" << endl;
- while (i2 <= b)
- {
- if (function_2(i2) * function_2(i2 + h) < 0)
- {
- counter++;
- x = Sec(function_2, i2, esp, i_counter);
- cout << setw(4) << counter << setw(10) << i2 << setw(17) << x << setw(10) << i_counter << endl;
- }
- i2 += h;
- }
- if (counter == 0)
- cout << "На данном отрезке корней нет!";
- } else if (action == '3') {
- cout << "Использовать значения по умолчанию(1), ввести вручную" << endl;
- char symbol; cin >> symbol;
- if (symbol == '1')
- a = -2, b = 5, h = 0.1, esp = 0.001;
- else
- inputdata(&a, &b, &h, &esp);
- double i2 = a;
- cout << "Корни\tЗначение х \tКорень \t Кол-во итераций" << endl;
- while (i2 <= b)
- {
- if (function_3(i2) * function_3(i2 + h) < 0)
- {
- counter++;
- x = New(function_3, Dfunction_3, i2, esp, i_counter);
- cout << setw(4) << counter << setw(10) << i2 << setw(17) << x << setw(22) << setw(10) << i_counter << endl;
- }
- i2 += h;
- }
- if (counter == 0)
- cout << "На данном отрезке корней нет!";
- }
- }
- void inputdata(double* a, double* b, double* h, double* esp)
- {
- cout << "Введите начало отрезка: ";
- cin >> *a;
- do
- {
- cout << "Введите конец отрезка: ";
- cin >> *b;
- } while (*b <= *a);
- do
- {
- cout << "введите шаг: ";
- cin >> *h;
- } while (fabs(*b - *a) < *h || *h <= 0);
- do
- {
- cout << "Введите точность: ";
- cin >> *esp;
- } while (*esp > *h);
- }
- double function(double x)
- {
- return x * x * x + 10 * x * x - 50;
- }
- double function_2(double x)
- {
- return log(x) - 5 * cos(x);
- }
- double function_3(double param) {
- return pow(param, 3.) - 5.*pow(param, 2.) + 12.;
- }
- double Dfunction_3(double param) {
- return 3.*pow(param, 2.) - 10.*param;
- }
- double Wegstein(double(*function)(double), double x0, double x1, double eps, int& i_counter)
- {
- double fx0 = 0, fx1 = 0, x2 = 0, de = 1;
- fx0 = function(x0); fx1 = function(x1);
- while (de > eps)
- {
- x2 = x1 - fx1 * (x1 - x0) / (fx1 - fx0);
- de = fabs(x1 - x2);
- fx0 = fx1;
- fx1 = function(x2);
- x0 = x1;
- x1 = x2;
- i_counter++;
- }
- return x2;
- }
- double Sec(double(*function_2)(double), double x1, double eps, int& i_counter)
- {
- double x0;
- i_counter = 0;
- do
- {
- x0 = x1;
- i_counter++;
- x1 = x0 - function_2(x0)*eps / (function_2(x0) - function_2(x0-eps));
- } while (fabs(x0 - x1) > eps);
- return x1;
- }
- double New(double(*function_2)(double), double (*Dfunction_2)(double), double x0, double eps, int& i_counter)
- {
- double x1 = x0 - function_2(x0) / Dfunction_2(x0);
- while (fabs(x0 - x1) > eps)
- {
- i_counter++;
- x0 = x1;
- x1 = x0 - function_2(x0) / Dfunction_2(x0);
- }
- return x1;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement