Advertisement
desdemona

gs vs jacobi

Apr 15th, 2013
261
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.56 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <stdlib.h>
  4. #include <time.h>
  5. using namespace std;
  6.  
  7. double norma(vector<double> a, vector<double> b)
  8. {
  9.     double joachim=0;
  10.     for(int i=0; i<a.size(); i++)
  11.     {
  12.         if(joachim<abs(a[i]-b[i]))
  13.             joachim = abs(a[i]-b[i]);
  14.     }
  15.     return joachim;
  16. }
  17.  
  18. int main()
  19. {
  20.     int t = 20;
  21.     srand(time(NULL));
  22.     int N = 1000;
  23.     double epsilon = 1;
  24.     int iter = 100000;
  25.     cout.precision(26);
  26.     cout <<"\n";
  27.     for(int i= 0; i<9; i++)
  28.     {
  29.         cout << epsilon << " ";
  30.         epsilon = (double)(epsilon/10.0);
  31.     }
  32.     epsilon = 1;
  33.     for(int iterator=0; iterator<t; iterator++)
  34.     {      
  35.         //cin >> N;
  36.         vector<vector<double> > macierzA;
  37.         vector<vector<double> > macierzM;
  38.         vector<vector<double> > macierzL;
  39.         vector<vector<double> > macierzU;
  40.         vector<vector<double> > macierzD;
  41.         vector<vector<double> > macierzN;
  42.         ////macierz L - od poczatku bez przekatnej
  43.         ////macierz D - przekatna
  44.         ////macierz U - od przekatnej do konca
  45.  
  46.         vector<double> x;
  47.         vector<double> wczesniej;
  48.         vector<double> b;
  49.         vector<double> x1, x2, b_gs;
  50.        
  51.         for(int i=0; i<N; i++)
  52.         {
  53.             x.push_back((double)(rand() / RAND_MAX));
  54.             x[i]+=((double)(rand()%9999));
  55.             //to przyblizenie poczatkowe moze byc inne
  56.             //podobno zwykle daje sie wektor zer.
  57.             //przyblizenie.push_back(0);
  58.             x1.push_back(0);
  59.             x2.push_back(0);
  60.             wczesniej.push_back(0);
  61.             b_gs.push_back(0);
  62.         }
  63.  
  64.         for(int i=0; i<N; i++)
  65.         {
  66.             vector<double> usagi;
  67.             vector<double> marchewka;
  68.             double btemp=0;
  69.             for(int j=0; j<N; j++)
  70.             {
  71.                 //chyba nie ma szans, zeby wyskoczyly tutaj jakies zera na glownej przekatnej.
  72.                 //dodam coś, derp. nigdy nie wiadomo z tymi randomami.
  73.                 double sailor_moon = (rand()%399) + (rand()/RAND_MAX);
  74.                 if(i==j)
  75.                 {
  76.                     sailor_moon+= (rand()%99999)*N;
  77.                     //diagonalnie dominujaca
  78.                 }
  79.                 usagi.push_back(sailor_moon);
  80.                 marchewka.push_back(0);
  81.                 btemp = btemp+sailor_moon * x[j];
  82.             }
  83.  
  84.             b.push_back(btemp);
  85.             macierzA.push_back(usagi);
  86.             macierzM.push_back(marchewka);
  87.             macierzD.push_back(marchewka);
  88.             macierzU.push_back(marchewka);
  89.             macierzL.push_back(marchewka);
  90.             macierzN.push_back(marchewka);
  91.         }
  92.  
  93.         //a moze dane z klawiatury? a może frytki do tego?
  94.         //for(int i=0; i<N; i++)
  95.         //{
  96.         //  vector<double> usagi;
  97.         //  for(int j=0; j<N+1; j++)
  98.         //  {
  99.         //      double sailor_moon;
  100.         //      cin >> sailor_moon;
  101.         //      usagi.push_back(sailor_moon);
  102.         //  }
  103.         //  macierz.push_back(usagi);
  104.         //}
  105.  
  106.         //jacobi
  107.         ////macierz L - od poczatku bez przekatnej
  108.         ////macierz D - przekatna
  109.         ////macierz U - od przekatnej do konca
  110.         for(int i=0; i<N; i++)
  111.         {
  112.             for(int j=0; j<i; j++)
  113.                 macierzL[i][j]=macierzA[i][j];
  114.         }
  115.        
  116.         for(int i=0; i<N; i++)
  117.             macierzD[i][i]=macierzA[i][i];
  118.        
  119.         for(int i=0; i<N; i++)
  120.         {
  121.             for(int j=i+1; j<N; j++)
  122.                 macierzU[i][j]=macierzA[i][j];
  123.         }
  124.  
  125.         // N = D^(-1)
  126.         for(int i=0; i<N; i++)
  127.             macierzN[i][i] = (1/macierzD[i][i]);
  128.        
  129.         for (int i=0; i<N; i++)
  130.         {
  131.             for (int j=0; j<N; j++)
  132.             {
  133.                 if (i == j)
  134.                     macierzM[i][j] = 0;
  135.                 else
  136.                     macierzM[i][j] = - (macierzA[i][j] * macierzN[i][i]);
  137.             }
  138.         }
  139.         //printf("Wynik jacobi\n");
  140.         cout << "\njacobi\n";
  141.         //tu wlasciwe obliczanie
  142.         double blad=0;
  143.         int jacobi=0; //k to iteracje ktorych szukamy, albo droidy
  144.  
  145.  
  146.         for (jacobi=0; jacobi<iter; jacobi++) {
  147.            
  148.             for(int i=0; i<N; i++)
  149.                 wczesniej[i]=x1[i];
  150.  
  151.             for (int i=0; i<N; i++)
  152.             {
  153.                 x2[i] = macierzN[i][i]*b[i];
  154.                 for (int j=0; j<N; j++)
  155.                     x2[i] += macierzM[i][j]*x1[j];
  156.             }
  157.             for (int i=0; i<N; i++)
  158.                 x1[i] = x2[i];
  159.  
  160.             blad=norma(x1, wczesniej);
  161.             //cout << "\n" << jacobi << "\n";
  162.             if(blad<epsilon)
  163.             {
  164.             //cout << blad << "\n";
  165.                 while(blad<epsilon)
  166.                 {
  167.                     //cout <<"e= " << epsilon << " iteracje = " << jacobi << "\n";
  168.                     cout << jacobi << " ";
  169.                     epsilon=epsilon/10.0;
  170.                     if(epsilon*10 < 1e-9)
  171.                         break;
  172.                 }
  173.                
  174.             if(epsilon*10 < 1e-10)
  175.                 break;
  176.             }
  177.         }
  178.  
  179.         //for(int i = 0; i < N; i++)
  180.         //{
  181.         //  //printf("x[%d] = %f\n", (i + 1), x1[i]) ;
  182.         //  //printf("blad wzgledny x[%d] = %f\n", (i + 1), x2[i]) ;
  183.         //  cout << "blad wzgledny x[" << i+1 << "] = " << x2[i] << "\n";
  184.         //}
  185.         //cout << "blad sredni wzgledny = " << blad_sredni_j << "\n";
  186.         //cout << "iteracje = " << jacobi << "\n";
  187.  
  188.         //to samo ale gauss-seidel czy jak tam.
  189.         // Calculate D^-1 * b
  190.         for (int i=0; i<N; i++)
  191.             b_gs[i] = b[i] * macierzN[i][i];
  192.  
  193.         //Calculate D^-1 * L
  194.         for (int i=0; i<N; i++)
  195.             for (int j=0; j<i; j++)
  196.                 macierzL[i][j] *= macierzN[i][i];
  197.  
  198.         //Calculate D^-1 * U
  199.         for (int i=0; i<N; i++)
  200.             for (int j=i+1; j<N; j++)
  201.                 macierzU[i][j] *= macierzN[i][i];
  202.         //tu tracimy rozwiazania z jacobiego
  203.         for(int i=0; i<N; i++)
  204.             x1[i]=0;
  205.  
  206.         int gauss_s =0;
  207.         //printf("Wynik gs\n");
  208.         cout << "\nG-S\n";
  209.         epsilon=1.0;
  210.         for (gauss_s=0;gauss_s<iter; gauss_s++)
  211.         {
  212.             for(int i=0; i<N; i++)
  213.                 wczesniej[i]=x1[i];
  214.  
  215.             for (int i=0; i<N; i++)
  216.             {
  217.                 x1[i] = b_gs[i];                       // x = D^-1*b -
  218.                 for (int j=0; j<i; j++)
  219.                     x1[i] -= macierzL[i][j]*x1[j];    // D^-1*L * x -
  220.                 for (int j=i+1; j<N; j++)
  221.                     x1[i] -= macierzU[i][j]*x1[j];    // D^-1*U * x
  222.             }
  223.  
  224.             blad=norma(x1, wczesniej);
  225.             if(blad<epsilon)
  226.             {
  227.                 //cout << blad << "\n";
  228.                
  229.                 while(blad<epsilon)
  230.                 {
  231.                     //cout <<"e= " << epsilon << " iteracje = " << gauss_s << "\n";
  232.                     cout << gauss_s << " ";
  233.                     epsilon=epsilon/10.0;
  234.                     if(epsilon*10 < 1e-10)
  235.                         break;
  236.                 }
  237.                
  238.                 if(epsilon*10 < 1e-9)
  239.                     break;
  240.             }
  241.         }
  242.  
  243.         epsilon=1;
  244.         cout << "\n\n";
  245.     }
  246.  
  247.     return 0;
  248. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement