Advertisement
Roulett

Iteracii_the_same

Jul 8th, 2019
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.30 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <conio.h>
  3. #include <iostream>
  4. #include <fstream>
  5. #include <stdio.h>
  6. #include <malloc.h>
  7. #include <stdlib.h>
  8. #include <math.h>
  9. using namespace std;
  10. std::ifstream f("in.txt");
  11. std::ofstream out("1.txt");
  12. double eps = 1.0e-12;
  13. #define PI 3.14159265
  14.  
  15. class Matrix
  16. {
  17. private:
  18.     int m;
  19.     int n;
  20.     double **arr; // двумерный массив
  21. public:
  22.     void Create() {
  23.         arr = new double*[n];
  24.         for (int i = 0; i < n; i++)
  25.             arr[i] = new double[m];
  26.     }
  27.     Matrix(int n, int m)
  28.     {
  29.         this->n = n;
  30.         this->m = m;
  31.         Create();
  32.     }
  33.     void del() {
  34.         for (int i = 0; i < m; i++)
  35.             delete[] arr[i];
  36.         delete[] arr;
  37.     }
  38.     int Get_n() {
  39.         return n;
  40.     }
  41.     int Get_m() {
  42.         return m;
  43.     }
  44.     double Get_arr(int i, int j) {
  45.         return arr[i][j];
  46.     }
  47.     void Copy(Matrix &right) {
  48.         del();
  49.         Create();
  50.         for (int i = 0; i < n; i++) {
  51.             for (int j = 0; j < m; j++) {
  52.                 arr[i][j] = right.arr[i][j];
  53.                 cout << arr[i][j] << " ";
  54.             }
  55.             cout << "\n";
  56.         }
  57.         cout << "\n";
  58.     };
  59.     friend void fout(Matrix A);
  60.     Matrix operator= (Matrix &right);
  61.     Matrix operator= (Matrix right);
  62.     Matrix operator+= (Matrix right);
  63.     Matrix operator-= (Matrix right);
  64.     friend Matrix operator+ (Matrix left, Matrix right);
  65.     friend Matrix operator- (Matrix left, Matrix right);
  66.     friend void Mfile(int a, Matrix &A, Matrix &b);
  67.     friend Matrix operator*(Matrix A, Matrix B);
  68.     friend Matrix operator*(double a, Matrix A);
  69.     friend double Gershgorin(Matrix A, double *m, double *M);
  70.     friend double Norm2(Matrix A);
  71.     friend void Cheb_ord(Matrix &A);
  72.     friend void Cheb(double *t, Matrix &P, double m, double M);
  73.     friend Matrix I(int n);
  74. };
  75.  
  76. void fout(Matrix A) {
  77.     for (int i = 0; i < A.n; i++) {
  78.         for (int j = 0; j < A.m; j++) {
  79.             out << A.arr[i][j] << " ";
  80.         }
  81.         out << "\n";
  82.     }
  83.     out << "\n";
  84. }
  85.  
  86. Matrix Matrix::operator= (Matrix &right) {
  87.     if (m != right.m || n != right.n) {
  88.         cout << "error \n";
  89.         exit(1);
  90.     }
  91.     if (this != &right)
  92.     Copy(right);
  93.     return *this;
  94. }
  95.  
  96. Matrix Matrix::operator= (Matrix right) {
  97.     if (m != right.m || n != right.n) {
  98.         cout << "error \n";
  99.         exit(1);
  100.     }
  101.     for (int i = 0; i < n; i++)
  102.         for (int j = 0; j < m; j++)
  103.             arr[i][j] = right.arr[i][j];
  104.     return *this;
  105. }
  106.  
  107. Matrix Matrix::operator+= (Matrix right)
  108. {
  109.     if (m != right.m || n != right.n) {
  110.         cout << "error \n";
  111.         exit(1);
  112.     }
  113.     for (int i = 0; i < n; i++) {
  114.         for (int j = 0; j < m; j++) {
  115.             arr[i][j] += right.arr[i][j];
  116.             cout << arr[i][j];
  117.             cout << " ";
  118.         }
  119.         cout << "\n";
  120.     }
  121.     cout << "\n";
  122.     return *this;
  123. }
  124.  
  125. Matrix Matrix::operator-= (Matrix right)
  126. {
  127.     if (m != right.m || n != right.n) {
  128.         cout << "error \n";
  129.         exit(1);
  130.     }
  131.     for (int i = 0; i < n; i++) {
  132.         for (int j = 0; j < m; j++) {
  133.             arr[i][j] -= right.arr[i][j];
  134.             cout << arr[i][j] << " ";
  135.         }
  136.         cout << "\n";
  137.     }
  138.     cout << "\n";
  139.     return *this;
  140. }
  141.  
  142. Matrix operator+(Matrix left, Matrix right) {
  143.     if (left.n != right.n || right.m != left.m) {
  144.         cout << "error \n";
  145.         exit(1);
  146.     }
  147.     Matrix add(left.n, left.m);
  148.     for (int i = 0; i < left.n; i++)
  149.         for (int j = 0; j < left.m; j++)
  150.             add.arr[i][j] = left.arr[i][j] + right.arr[i][j];
  151.     return add;
  152. }
  153.  
  154. Matrix operator*(Matrix A, Matrix B) {
  155.     if (A.m != B.n) {
  156.         cout << "error";
  157.         exit(1);
  158.     }
  159.     Matrix mult(A.n, B.m);
  160.     for (int i = 0; i < A.n; i++){
  161.         for (int k = 0; k < B.m; k++) {
  162.             double t = 0;
  163.             for (int j = 0; j < A.n; j++) t += A.arr[i][j] * B.arr[j][k];
  164.             mult.arr[i][k] = t;
  165.             cout << mult.arr[i][k] << " ";
  166.         }
  167.         cout << "\n";
  168.     }
  169.     cout << "\n";
  170.     return mult;
  171. }
  172.  
  173. Matrix operator*(double a, Matrix A) {
  174.     Matrix mult(A.n, A.m);
  175.     for (int i = 0; i < A.n; i++) {
  176.         for (int j = 0; j < A.m; j++) {
  177.             mult.arr[i][j] = a * A.arr[i][j];
  178.             cout << mult.arr[i][j] << " ";
  179.         }
  180.         cout << "\n";
  181.     }
  182.     return mult;
  183. }
  184.  
  185. Matrix operator-(Matrix left, Matrix right) {
  186.     if (left.n != right.n || left.m != right.m) {
  187.         cout << "error";
  188.         exit(1);
  189.     }
  190.     Matrix sub = (-1)*right;
  191.     sub += left;
  192.     return sub;
  193. }
  194.  
  195. void Mfile(int N, Matrix &A, Matrix &b) {
  196.     for (int i = 0; i < N; i++) {
  197.         for (int j = 0; j < N; j++) {
  198.             f >> A.arr[i][j];
  199.             cout << A.arr[i][j] << " ";
  200.         }
  201.         cout << "\n";
  202.     }
  203.     for (int i = 0; i < N; i++) {
  204.         f >> b.arr[i][0];
  205.         cout << b.arr[i][0] << " ";
  206.     };
  207.     cout << "\n";
  208. }
  209.  
  210. Matrix I(int n) {
  211.     Matrix I(n, n);
  212.     for (int i = 0; i < n; i++) {
  213.         for (int j = 0; j < i; j++) {
  214.             I.arr[i][j] = 0;
  215.             cout << I.arr[i][j] << " ";
  216.         }
  217.         I.arr[i][i] = 1;
  218.         cout << I.arr[i][i] << " ";
  219.         for (int j = i+1; j < n; j++) {
  220.             I.arr[i][j] = 0;
  221.             cout << I.arr[i][j] << " ";
  222.         }
  223.         cout << "\n";
  224.     }
  225.     return I;
  226. }
  227.  
  228. double Gershgorin(Matrix A, double *m, double *M) {
  229.     if (A.n != A.m) {
  230.         cout << "error";
  231.         exit(1);
  232.     }
  233.     double t = 0;
  234.     *m = A.arr[0][0], *M = A.arr[0][0];
  235.     for (int i = 0; i < A.n; i++) {
  236.         t = 0;
  237.         for (int j=0; j<i; j++) t += fabs(A.arr[i][j]);
  238.         for (int j = i+1; j < A.n; j++) t += fabs(A.arr[i][j]);
  239.         if (*m > A.arr[i][i] - t) *m = A.arr[i][i] - t;
  240.         if (*M < A.arr[i][i] + t) *M = A.arr[i][i] + t;
  241.     }
  242.     if (*m + *M == 0) {
  243.         cout << "error";
  244.         exit(1);
  245.     }
  246.     return 2 / (*m + *M);
  247. }
  248.  
  249. double Norm2(Matrix A) {
  250.     double t = 0;
  251.     for (int i = 0; i < A.n; i++) {
  252.         t += A.arr[i][0]*A.arr[i][0];
  253.     }
  254.     double M = sqrt(t);
  255.     return M;
  256. }
  257.  
  258. void Cheb_ord(Matrix &P) { //0 строка - параметры P[1], 1 - P[2], 2- P[4] и тд
  259.     int p = 1;
  260.     P.arr[0][0] = 1;
  261.     cout << p << P.arr[0][0] << "\n";
  262.     for (int i = 1; i < P.n; i++) {
  263.         p *= 2;
  264.         for (int j = 0; j < p; j+=2) {
  265.             P.arr[i][j] = P.arr[i-1][j/2];
  266.             P.arr[i][j + 1] = 2*p - P.arr[i][j];
  267.             cout << P.arr[i][j] << " " << P.arr[i][j + 1] << " ";
  268.         }
  269.         cout << p << "\n";
  270.     }
  271. }
  272.  
  273. void Cheb(double *t, Matrix &P, double m, double M) {
  274.     Cheb_ord(P);
  275.     int p = P.n - 1, p2 = P.m;
  276.     double k, a = m + M, b = M - m;
  277.     for (int i = 0; i < p2; i++) {
  278.         k = P.arr[p][i] * PI / (2*p2);
  279.         t[i] = 2 / (a - b * cos(k));
  280.         cout << t[i] << " ";
  281.     }
  282.     cout << "\n";
  283. }
  284.  
  285. int main()
  286. {
  287.     int N, p;
  288.     f >> N;
  289.     f >> p;
  290.     Matrix E = I(N);
  291.     Matrix A(N, N), b(N, 1);
  292.     Mfile(N, A, b);
  293.     double m, M;
  294.     double tau=Gershgorin(A, &m, &M);
  295.     cout << tau;
  296.     Matrix X0 = 0 * b;
  297.     out << " Linear equation A*x = b. We initialize X[0] to the solution of the equation.\n";
  298.     out << "Matrix A = \n";
  299.     fout(A);
  300.     out << "Vector b = \n";
  301.     fout(b);
  302.     out << "Initial guess X[0] = \n";
  303.     fout(X0);
  304.     Matrix A1 = E + (-tau)*A;
  305.     Matrix b1 = tau * b;
  306.     Matrix X1 = A1 * X0 + b1;
  307.     Matrix Res = A * X1 - b;
  308.     double x = Norm2(Res);
  309.     int k = 1;
  310.     out << "1) Norm of Res[" << k << "] = " << x << "\n";
  311.     fout(X1);
  312.     while (x >eps) {
  313.         if (k % 2) {// то есть мы по X1 строим X2, но чтобы обойтись двумя векторами, стираем и заполняем заново X0;
  314.             X0 = A1 * X1 + b1; //X[n+1]=(E-tau*A)*X[n]+tau*b; n+1 - количество итераций - одну мы выполнили до while;
  315.             Res = A * X0 - b;
  316.         }
  317.         else {
  318.             X1 = A1 * X0 + b1;
  319.             Res = A * X1 - b;
  320.         }
  321.         x = Norm2(Res);
  322.         k++;
  323.         out << k << ") Norm of Res[" << k << "] = " << x << "\n";
  324.     }
  325.     out << "Fixed-point iteration method with " << k << " iterations gives the solution:\n";
  326.     if (k % 2) fout(X0); //решение методом простых итераций
  327.     else fout(X1); // или это
  328.     cout << "\n\n\n";
  329.  
  330.     int p2 = (int)pow(2, p);
  331.     Matrix P(p+1, p2);
  332.     double *t= new double[p2];
  333.     Cheb(t, P, m, M);
  334.     X0 = 0 * b;
  335.     X1 = X0 + t[0] * b - t[0] * A * X0;
  336.     Res = A * X1 - b;
  337.     x = Norm2(Res);
  338.     k = 1;
  339.     int k1 = 1;
  340.     out << "1) Norm of Res[" << k << "] = " << x << "\n";
  341.     fout(X1);
  342.     while (x > eps) {
  343.         k1 = (k - 1) % p2;
  344.         if (k % 2) {// то есть мы по X1 строим X2, но чтобы обойтись двумя векторами, стираем и заполняем заново X0;
  345.             X0 = X1 + t[k1] * b - t[k1] * A * X1;
  346.             Res = A * X0 - b;
  347.         }
  348.         else {
  349.             X1 = X0 + t[k1] * b - t[k1] * A * X0;
  350.             Res = A * X1 - b;
  351.         }
  352.         x = Norm2(Res);
  353.         k++;
  354.         out << "Parameter " << t[k1] << "\n";
  355.         out << k << ") Norm of Res[" << k << "] = " << x << "\n";
  356.     }
  357.     out << "Chebyshev-point iteration method with " << k << " iterations gives the solution:\n";
  358.     if (k % 2) fout(X0); //решение методом чебышёвских параметров
  359.     else fout(X1); // или это
  360.     X0.del();
  361.     X1.del();
  362.  
  363.     out.close();
  364.     return 0;
  365. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement