Advertisement
desdemona

jacobi smierdzi.

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