Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- using std::cout;
- using std::cin;
- using std::endl;
- double function1(double x, double y); //1 функция системы
- double function2(double x, double y); //2 функция системы
- double derivative_func1_dx(double x, double y); //1 производная 1 функции по x
- double derivative_func1_dy(double x, double y); //1 производная 1 функции по y
- double derivative_func2_dx(double x, double y); //1 производная 2 функции по x
- double derivative_func2_dy(double x, double y); //1 производная 2 функции по y
- double fi_x(double x, double y); // функция fi1(x, y) - выраженный x из 2 уравнения
- double fi_y(double x, double y); // функция fi2(x, y) - выраженный y из 1 уравнения
- void newton(double x, double y, double eps); // метод Ньютона для системы нелинейных уравнений
- void simple_iter(double x, double y, double eps); // метод простой итерации для системы нелинейных уравнений
- void jacobian(double** a); //вычиление матрицы якоби
- int main()
- {
- unsigned short int pck = -1;
- bool check_task = false;
- cout << "Solving systems of nonlinear equations" << endl;
- cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;
- cout << "Choose a method:\n1. Newton's method\n2. Simple iteration method\nEnter:";
- while (check_task == false)
- {
- cin >> pck;
- switch (pck)
- {
- case 1:
- {
- check_task = true;
- double a, b, eps;
- cout << "Newton Method" << endl;
- cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;
- cout << "Enter a (approximate value of x): "; cin >> a;
- cout << "Enter b (approximate value of y): "; cin >> b;
- cout << "Enter eps: "; cin >> eps;
- newton(a, b, eps);
- break;
- }
- case 2:
- {
- check_task = true;
- double a, b, eps;
- cout << "Simple iteration method" << endl;
- cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;
- cout << "Enter a (approximate value of x): "; cin >> a;
- cout << "Enter b (approximate value of y): "; cin >> b;
- cout << "Enter eps: "; cin >> eps;
- simple_iter(a, b, eps);
- break;
- }
- default: {cout << "#Error#\nEnter a number of method again: "; }
- }
- }
- return 0;
- }
- double function1(double x, double y)
- {
- return sin(x) - y - 1.2 ;
- }
- double function2(double x, double y)
- {
- return 0.15 + cos(y) - x;
- }
- double derivative_func1_dx(double x, double y)
- {
- return cos(x);
- }
- double derivative_func2_dx(double x, double y)
- {
- return -1;
- }
- double derivative_func1_dy(double x, double y)
- {
- return -1;
- }
- double derivative_func2_dy(double x, double y)
- {
- return sin(y);
- }
- double fi_x(double x, double y)
- {
- return 0.15 + cos(y);
- }
- double fi_y(double x, double y)
- {
- return sin(x) - 1.2;
- }
- void newton(double x, double y, double eps)
- {
- double** mass_a = new double* [2];
- for (int i = 0; i < 2; i++)
- mass_a[i] = new double[2];
- double dx, dy, n;
- double* b = new double[2];
- unsigned int count = 0;
- do
- {
- mass_a[0][0] = derivative_func1_dx(x, y);
- mass_a[0][1] = derivative_func1_dy(x, y);
- mass_a[1][0] = derivative_func2_dx(x, y);
- mass_a[1][1] = derivative_func2_dy(x, y);
- jacobian(mass_a);
- dx = -mass_a[0][0] * function1(x, y) + (-mass_a[0][1] * function2(x, y));
- dy = -mass_a[1][0] * function1(x, y) + (-mass_a[1][1] * function2(x, y));
- x += dx;
- y += dy;
- b[0] = function1(x, y);
- b[1] = function2(x, y);
- n = sqrt(b[0] * b[0] + b[1] * b[1]);
- count++;
- } while (n >= eps);
- cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;
- cout << "Solution of the system of equations: \n";
- cout << "System of equations: sin(x) - y = 1.2 | 0.15 + cos(y) - x = 0" << endl;
- cout << "X= " << x << "\nY= " << y << endl;
- cout << "Count of iterations= " << count << endl;
- cout << "Checking the resulting solution:" << endl;
- printf("Function 1 (x, y) = %2.12f\nFunction 2 (x, y) = %2.12f\n", function1(x, y), function2(x, y));
- cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;
- for (int i = 0; i < 2; i++)
- {
- delete[] mass_a[i];
- }
- delete[] b;
- }
- void jacobian(double** a)
- {
- double det;
- det = (a[0][0] * a[1][1]) - (a[0][1] * a[1][0]);
- for (int i = 0; i < 2; i++)
- {
- for (int j = 0; j < 2; j++)
- {
- if (i == 0 and j == 0)a[i][j] = a[i + 1][j + 1] / det;
- else if (i != j)a[i][j] = -a[i][j] / det;
- else if (i == 1 and j == 1)a[i][j] = a[i - 1][j - 1] / det;
- }
- }
- }
- void simple_iter(double x, double y, double eps)
- {
- double x_last, y_last;
- unsigned int count = 0;
- do
- {
- x_last = x;
- y_last = y;
- x = fi_x(x_last, y_last);
- y = fi_y(x_last, y_last);
- count++;
- } while (fabs(function1(x, y)) >= eps and fabs(function2(x, y)) >= eps);
- cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;
- cout << "Solution of the system of equations: \n";
- cout << "System of equations: sin(x) - y = 1.2 | 0.15 + cos(y) - x = 0" << endl;
- cout << "X= " << x << "\nY= " << y << endl;
- cout << "Count of iterations= " << count << endl;
- cout << "Checking the resulting solution:" << endl;
- printf("Function 1 (x, y) = %2.12f\nFunction 2 (x, y) = %2.12f\n", function1(x, y), function2(x, y));
- cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;
- }
Add Comment
Please, Sign In to add comment