Advertisement
desdemona

błąd.

Apr 10th, 2013
254
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.94 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 = 3;
  10.     srand(time(NULL));
  11.     int liczba_rownan = 5;
  12.     double epsilon = 1;
  13.     int iter = 100000;
  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> 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.         printf("Wynik jacobi\n");
  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.             {
  150.             //cout << blad << "\n";
  151.                 while(blad<epsilon)
  152.                 {
  153.                     cout <<"e= " << epsilon << " iteracje = " << jacobi << "\n";
  154.                     epsilon=epsilon/10.0;
  155.                 }
  156.                
  157.             if(epsilon*10 < 1e-6)
  158.                 break;
  159.             }
  160.         }
  161.  
  162.        
  163.         for(int i=0; i<liczba_rownan; i++)
  164.             x2[i]=abs(abs(x[i]-x1[i])/x[i]);
  165.  
  166.         double blad_sredni_j=blad/liczba_rownan;
  167.  
  168.         //for(int i = 0; i < liczba_rownan; i++)
  169.         //{
  170.         //  //printf("x[%d] = %f\n", (i + 1), x1[i]) ;
  171.         //  //printf("blad wzgledny x[%d] = %f\n", (i + 1), x2[i]) ;
  172.         //  cout << "blad wzgledny x[" << i+1 << "] = " << x2[i] << "\n";
  173.         //}
  174.         //cout << "blad sredni wzgledny = " << blad_sredni_j << "\n";
  175.         //cout << "iteracje = " << jacobi << "\n";
  176.  
  177.         //to samo ale gauss-seidel czy jak tam.
  178.         // Calculate D^-1 * b
  179.         for (int i=0; i<liczba_rownan; i++)
  180.             b_gs[i] = b[i] * macierzN[i][i];
  181.  
  182.         //Calculate D^-1 * L
  183.         for (int i=0; i<liczba_rownan; i++)
  184.             for (int j=0; j<i; j++)
  185.                 macierzL[i][j] *= macierzN[i][i];
  186.  
  187.         //Calculate D^-1 * U
  188.         for (int i=0; i<liczba_rownan; i++)
  189.             for (int j=i+1; j<liczba_rownan; j++)
  190.                 macierzU[i][j] *= macierzN[i][i];
  191.         //tu tracimy rozwiazania z jacobiego
  192.         for(int i=0; i<liczba_rownan; i++)
  193.             x1[i]=0;
  194.  
  195.         int gauss_s =0;
  196.         printf("Wynik gs\n");
  197.         epsilon=1.0;
  198.         for (gauss_s=0;gauss_s<iter; gauss_s++)
  199.         {
  200.             for (int i=0; i<liczba_rownan; i++)
  201.             {
  202.                 x1[i] = b_gs[i];                       // x = D^-1*b -
  203.                 for (int j=0; j<i; j++)
  204.                     x1[i] -= macierzL[i][j]*x1[j];    // D^-1*L * x -
  205.                 for (int j=i+1; j<liczba_rownan; j++)
  206.                     x1[i] -= macierzU[i][j]*x1[j];    // D^-1*U * x
  207.             }
  208.  
  209.             blad=0;
  210.             for(int i=0; i<liczba_rownan; i++)
  211.             {
  212.                 double usagi=0;
  213.                 for(int j=0; j<liczba_rownan; j++)
  214.                 {
  215.                     usagi+=macierzA[i][j]*x1[j];
  216.                 }
  217.                 usagi=abs(usagi-b[i]);
  218.                 blad+=usagi;
  219.                
  220.             }
  221.  
  222.             if(blad<epsilon)
  223.             {
  224.                 //cout << blad << "\n";
  225.                
  226.                 while(blad<epsilon)
  227.                 {
  228.                     cout <<"e= " << epsilon << " iteracje = " << gauss_s << "\n";
  229.                     epsilon=epsilon/10.0;
  230.                 }
  231.                
  232.                 if(epsilon*10 < 1e-6)
  233.                     break;
  234.             }
  235.         }
  236.  
  237.            
  238.  
  239.             for(int i=0; i<liczba_rownan; i++)
  240.                 x2[i]=abs(abs(x[i]-x1[i])/x[i]);
  241.  
  242.             double blad_sredni_gs=blad/liczba_rownan;
  243.             //for(int i=0; i<liczba_rownan; i++)
  244.             //  blad_sredni_gs+=x2[i];
  245.  
  246.             //blad_sredni_gs=blad_sredni_gs/liczba_rownan;
  247.  
  248.  
  249.             //for (int i=0; i<liczba_rownan; i++)
  250.             //{
  251.             //  //printf("blad wzgledny x[%d] = %f\n", (i + 1), x2[i]) ;
  252.             //  cout << "blad wzgledny x[" << i+1 << "] = " << x2[i] << "\n";
  253.             //}
  254.             //cout << "iteracje = " << gauss_s << "\n";
  255.             //cout << "blad sredni wzgledny = " << blad_sredni_gs << "\n";
  256.                 //printf("x[%d] = %f\n", (i+1), x[i]);
  257.  
  258.         //double  eg_sr= 0;
  259.         //double x_sr=0;
  260.         //for(int i=0; i<x.size(); i++)
  261.         //{
  262.         //  eg_sr += abs(x_eg[i]);
  263.         //  x_sr += abs(x[i]);
  264.         //}
  265.         //eg_sr = eg_sr/x.size();
  266.         //x_sr=x_sr/x.size();
  267.  
  268.         //double bb= abs(eg_sr - x_sr);
  269.         //double bw = bb/x_sr;
  270.  
  271.        
  272.         //cout << "blad bezwzgledny " << bb << "\n";
  273.         //cout << "blad wzgledny " << bw << "\n\n";
  274.         //cout << bw << "\n";
  275.         //if(bb == 0 || bw == 0)
  276.         //{
  277.         //  iterator = 0;
  278.         //}
  279.         //cout << liczba_rownan << "\t"
  280.         //cout << liczba_obiegow; //<< "\n";
  281.         //liczba_rownan+=5;
  282.         epsilon=1;
  283.     }
  284.  
  285.     return 0;
  286. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement