SeriousVenom

Lab2_SSNE

Apr 15th, 2021 (edited)
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.87 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3.  
  4. using std::cout;
  5. using std::cin;
  6. using std::endl;
  7.  
  8.  
  9. double function1(double x, double y); //1 функция системы
  10. double function2(double x, double y); //2 функция системы
  11. double derivative_func1_dx(double x, double y); //1 производная 1 функции по x
  12. double derivative_func1_dy(double x, double y); //1 производная 1 функции по y
  13. double derivative_func2_dx(double x, double y); //1 производная 2 функции по x
  14. double derivative_func2_dy(double x, double y); //1 производная 2 функции по y
  15. double fi_x(double x, double y); // функция fi1(x, y) - выраженный x из 2 уравнения
  16. double fi_y(double x, double y); // функция fi2(x, y) - выраженный y из 1 уравнения
  17. void newton(double x, double y, double eps); // метод Ньютона для системы нелинейных уравнений
  18. void simple_iter(double x, double y, double eps); // метод простой итерации для системы нелинейных уравнений
  19. void jacobian(double** a); //вычиление матрицы якоби
  20.  
  21. int main()
  22. {
  23.     unsigned short int pck = -1;
  24.     bool check_task = false;
  25.     cout << "Solving systems of nonlinear equations" << endl;
  26.     cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;
  27.     cout << "Choose a method:\n1. Newton's method\n2. Simple iteration method\nEnter:";
  28.  
  29.     while (check_task == false)
  30.     {
  31.         cin >> pck;
  32.         switch (pck)
  33.         {
  34.         case 1:
  35.         {
  36.             check_task = true;
  37.             double a, b, eps;
  38.             cout << "Newton Method" << endl;
  39.             cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;
  40.             cout << "Enter a (approximate value of x): "; cin >> a;
  41.             cout << "Enter b (approximate value of y): "; cin >> b;
  42.             cout << "Enter eps: "; cin >> eps;
  43.  
  44.             newton(a, b, eps);
  45.  
  46.             break;
  47.         }
  48.         case 2:
  49.         {
  50.             check_task = true;
  51.             double a, b, eps;
  52.             cout << "Simple iteration method" << endl;
  53.             cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;
  54.             cout << "Enter a (approximate value of x): "; cin >> a;
  55.             cout << "Enter b (approximate value of y): "; cin >> b;
  56.             cout << "Enter eps: "; cin >> eps;
  57.  
  58.             simple_iter(a, b, eps);
  59.  
  60.             break;
  61.         }
  62.         default: {cout << "#Error#\nEnter a number of method again: "; }
  63.         }
  64.     }
  65.     return 0;
  66. }
  67.  
  68. double function1(double x, double y)
  69. {
  70.     return sin(x) - y - 1.2 ;
  71. }
  72. double function2(double x, double y)
  73. {
  74.     return 0.15 + cos(y) - x;
  75. }
  76. double derivative_func1_dx(double x, double y)
  77. {
  78.     return cos(x);
  79. }
  80. double derivative_func2_dx(double x, double y)
  81. {
  82.     return -1;
  83. }
  84. double derivative_func1_dy(double x, double y)
  85. {
  86.     return -1;
  87. }
  88. double derivative_func2_dy(double x, double y)
  89. {
  90.     return sin(y);
  91. }
  92. double fi_x(double x, double y)
  93. {
  94.     return 0.15 + cos(y);
  95. }
  96. double fi_y(double x, double y)
  97. {
  98.     return sin(x) - 1.2;
  99. }
  100. void newton(double x, double y, double eps)
  101. {
  102.     double** mass_a = new double* [2];
  103.     for (int i = 0; i < 2; i++)
  104.         mass_a[i] = new double[2];
  105.     double dx, dy, n;
  106.     double* b = new double[2];
  107.     unsigned int count = 0;
  108.     do
  109.     {
  110.         mass_a[0][0] = derivative_func1_dx(x, y);
  111.         mass_a[0][1] = derivative_func1_dy(x, y);
  112.         mass_a[1][0] = derivative_func2_dx(x, y);
  113.         mass_a[1][1] = derivative_func2_dy(x, y);
  114.         jacobian(mass_a);
  115.         dx = -mass_a[0][0] * function1(x, y) + (-mass_a[0][1] * function2(x, y));
  116.         dy = -mass_a[1][0] * function1(x, y) + (-mass_a[1][1] * function2(x, y));
  117.         x += dx;
  118.         y += dy;
  119.         b[0] = function1(x, y);
  120.         b[1] = function2(x, y);
  121.         n = sqrt(b[0] * b[0] + b[1] * b[1]);
  122.         count++;
  123.     } while (n >= eps);
  124.     cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;
  125.     cout << "Solution of the system of equations: \n";
  126.     cout << "System of equations: sin(x) - y = 1.2 | 0.15 + cos(y) - x = 0" << endl;
  127.     cout << "X= " << x << "\nY= " << y << endl;
  128.     cout << "Count of iterations= " << count << endl;
  129.     cout << "Checking the resulting solution:" << endl;
  130.     printf("Function 1 (x, y) = %2.12f\nFunction 2 (x, y) = %2.12f\n", function1(x, y), function2(x, y));
  131.     cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;
  132.  
  133.  
  134.     for (int i = 0; i < 2; i++)
  135.     {
  136.         delete[] mass_a[i];
  137.     }
  138.     delete[] b;
  139. }
  140. void jacobian(double** a)
  141. {
  142.     double det;
  143.     det = (a[0][0] * a[1][1]) - (a[0][1] * a[1][0]);
  144.     for (int i = 0; i < 2; i++)
  145.     {
  146.         for (int j = 0; j < 2; j++)
  147.         {
  148.             if (i == 0 and j == 0)a[i][j] = a[i + 1][j + 1] / det;
  149.             else if (i != j)a[i][j] = -a[i][j] / det;
  150.             else if (i == 1 and j == 1)a[i][j] = a[i - 1][j - 1] / det;
  151.         }
  152.     }
  153. }
  154. void simple_iter(double x, double y, double eps)
  155. {
  156.     double x_last, y_last;
  157.     unsigned int count = 0;
  158.     do
  159.     {
  160.         x_last = x;
  161.         y_last = y;
  162.         x = fi_x(x_last, y_last);
  163.         y = fi_y(x_last, y_last);
  164.         count++;
  165.     } while (fabs(function1(x, y)) >= eps and fabs(function2(x, y)) >= eps);
  166.     cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;
  167.     cout << "Solution of the system of equations: \n";
  168.     cout << "System of equations: sin(x) - y = 1.2 | 0.15 + cos(y) - x = 0" << endl;
  169.     cout << "X= " << x << "\nY= " << y << endl;
  170.     cout << "Count of iterations= " << count << endl;
  171.     cout << "Checking the resulting solution:" << endl;
  172.     printf("Function 1 (x, y) = %2.12f\nFunction 2 (x, y) = %2.12f\n", function1(x, y), function2(x, y));
  173.     cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;
  174. }
Add Comment
Please, Sign In to add comment