Advertisement
desdemona

gs i jacobi

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