Advertisement
desdemona

gauss-seidel, jacobi?

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