Advertisement
MaPV

VP_5_1_sopr_grad

Jan 13th, 2017
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.29 KB | None | 0 0
  1. /*разновидность метода сопряженных направлений т.е. решение ищется в виде линейной комбинации векторов, ортогональных в скалярном произведении, которое порождено матрицей
  2. системы*/
  3. #include <iostream>
  4. #include <cmath>
  5. #include <iomanip>
  6. #include <vector>
  7.  
  8. using namespace std;
  9.  
  10. int L = 9;
  11. int N = 3;
  12.  
  13. double sk (vector<double>&a,vector<double> &b){ //скалярное прозведение
  14. double c=0;
  15. for (int i = 0; i < N ;i++)
  16.     c+=a[i]*b[i];
  17. return c;
  18. }
  19.  
  20. void mv (vector <vector<double>>&a,vector<double>&b,vector<double>&c)
  21. {//умножение матрицы на столбец
  22. for (int i=0;i<N;i++)
  23.     for(int j=0;j<N;j++)
  24.     c[i]+=a[i][j]*b[j];
  25. }
  26.  
  27. void crt (vector<vector<double>> &a,vector<double>&b){
  28.     cout << "Введите симметрическую + матрицу А: " << endl;
  29.     for (int i = 0; i < N; i++){
  30.         for (int j = 0; j < N; j++){
  31.             cin >> a[i][j];
  32.         }
  33.     }
  34.     cout << "Введите стоблец свободных членов:" << endl;
  35.     for (int i = 0; i < N; i++){
  36.         cin >> b[i];
  37.     }
  38.     cout << endl;
  39. }
  40. void prnt (vector<vector<double>> &a){
  41.    
  42.     for (int i = 0; i < N; i++){
  43.         for (int j = 0; j < N; j++){
  44.             cout << a[i][j] << " ";
  45.         }
  46.         cout << "\n";
  47.     }
  48.     cout << "\n";
  49. }
  50. void prntB (vector<double>& a){
  51.     for (int i = 0; i < N; i++){
  52.         cout <<a[i] << " ";
  53.     }
  54.     cout << "\n";
  55. }
  56. bool converge (vector<double> &a, double e){
  57. double norm;
  58. norm=sk(a,a);
  59. if (sqrt(norm)>=e)
  60.     return false;
  61. return true;
  62. }
  63.  
  64. void GRADIENTIREN(vector<vector<double>>&a,vector<double>&b){
  65. int k=0;
  66. double e;
  67. cout << "Введите точность вычислений : ";
  68. cin >> e;
  69. cout << endl;
  70. vector<vector<double>>x(2,vector<double>(N)),r(2,vector<double>(N)),z(2,vector<double>(N));
  71. vector<double>res(N);
  72. double ak,bk;
  73. //x[0]={1,2,3}; //начальное приближение
  74. mv(a,x[0],res);
  75. for(int i=0;i<N;i++) //podgotovka
  76.     r[0][i]=b[i]-res[i]; //невязка
  77.     z[0]=r[0]; //векторы сопряженных направлений
  78. res={0,0,0};
  79. do{
  80. k++;
  81. mv(a,z[0],res);
  82. ak=(sk(r[0],r[0]))/(sk(res,z[0])); //коэффициент разложения решения по Z векторам
  83. for (int i = 0;i < N;i++){
  84.     x[1][i]=x[0][i]+(ak*z[0][i]);
  85.     r[1][i]=r[0][i]-(ak*(res[i]));
  86. }
  87. res={0,0,0};
  88. bk=sk(r[1],r[1])/sk(r[0],r[0]);
  89. for (int i=0;i<N;i++)
  90.     z[1][i]=r[1][i]+bk*z[0][i];
  91. cout<<k<<"-я итерация : "<<endl;
  92. for (int i = 0; i < N; i++){
  93.     cout << "X" << i + 1 << " = " << x[1][i] << fixed << setprecision (L) << endl;
  94. }
  95. x[0]=x[1];
  96. z[0]=z[1];
  97. r[0]=r[1];
  98. }//while (k<N);
  99. while (sqrt(sk(r[1],r[1]))>=e);
  100.  
  101.  
  102. //вывод решения
  103. cout << "\nРешение системы:" << endl;
  104. for (int i = 0; i < N; i++){
  105.     cout << "X" << i + 1 << " = " << x[1][i] << fixed << setprecision (L) << endl;
  106. }
  107. cout << "Число итераций: " << k  << endl;
  108.  
  109. }
  110.  
  111. int main (){
  112.     setlocale(LC_ALL,"ru");
  113.     vector<vector<double>>A(N,vector<double>(N));
  114.     vector<double>B(N);
  115.     A[0] = {5.6,2.8,6.7};
  116.     A[1] = {2.8,9.18,0.3};
  117.     A[2] = {6.7,0.3,7.3};
  118.     B[0] = {10};
  119.     B[1] = {15.9};
  120.     B[2] = {32.6};
  121.     //crt(A,B);
  122.     prnt(A);
  123.     prntB(B);
  124.     GRADIENTIREN(A,B);
  125.     system("pause");
  126.     return 0;  
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement