SHARE
TWEET

Untitled

a guest May 19th, 2019 73 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4.  
  5. class Dyskretyzacja{
  6.     int N;                      //liczba podprzedziałów
  7.     double x1;                  //punkty brzegowe
  8.     double x2;
  9.     double h,                   //dlugosc przedziałow
  10.             *l,                 //dolna przekątna macierzy trójdiagonalnej
  11.             *d,                 //środkowa przekątna macierzy trójdiagonalnej
  12.             *u,                 //górna przekątna macierzy trójdiagonalnej  
  13.             *b,                 //wektor wyrazow wolnych
  14.             *blad,              //wektor błedów obliczeń
  15.             *x;                 //wektor rozwiazań macierzy
  16.  
  17. public:
  18.     /* KONSTRUKTORY */
  19.     Dyskretyzacja() { N = 20; x1 =0; x2 = 2; alokacja_pamieci();}
  20.     Dyskretyzacja(int n) { N = n; x1 =0; x2 = 2; alokacja_pamieci();}
  21.     /* DESTRUKTOR */
  22.     ~Dyskretyzacja() { dealokacja_pamieci();}
  23.  
  24.     /* METODY */
  25.     double U(double x);                             //wzór analityczny
  26.     double dyskretyzacja_konwencjonalna(); 
  27.     double dyskretyzacja_Numerowa();
  28.     void algorytm_Thomasa();
  29.     double najw_blad();
  30.     void ustawN(int wartosc) { N = wartosc; }
  31.     int dajN() { return N; }
  32.     double dajH() { return h; }
  33.  
  34.     /** Metoda alokująca pamięć pod wektory  */
  35.     void alokacja_pamieci()
  36.     {
  37.         h = fabs(x2 - x1) / (N - 1);
  38.         l = new double[N]; d = new double[N];
  39.         u = new double[N]; b = new double[N];
  40.         blad = new double[N]; x = new double [N];
  41.     }
  42.  
  43.     /** Metoad zwalniająca pamięc zarezerwowaną pod wektory  */
  44.     void dealokacja_pamieci()
  45.     {
  46.         delete []l; delete []d; delete []u; delete []b; delete []blad; delete []x;
  47.     }
  48.  
  49. };
  50.  
  51. /**
  52. *   Funkcja zwracająca dokładny wynik
  53. *   @param x Argument funkcji
  54. *   @return Wartość funkcji w punkcie x
  55. */
  56. double Dyskretyzacja::U(double x)
  57. {
  58.     return (exp(x / 2.0) - exp(2.0 - x / 2.0)) / (1 - exp(2.0));
  59. }
  60.  
  61. /**
  62. *   Metoda wyszukująca największy bład w obliczeniach
  63. */
  64. double Dyskretyzacja::najw_blad()
  65. {
  66.  double max = 0;
  67.  for(int i = 0; i < N; i++)
  68.     if(fabs(blad[i]) > max)
  69.         max = fabs(blad[i]);
  70.  return max;
  71. }
  72.  
  73. double Dyskretyzacja::dyskretyzacja_konwencjonalna()
  74. {
  75.      double a = 0.0;
  76.  
  77.      dealokacja_pamieci();
  78.      alokacja_pamieci();
  79.  
  80.      l[0] = 0.0;
  81.      d[0] = 1.0;
  82.      u[0] = 0.0;
  83.      b[0] = 1.0;
  84.  
  85.      for(int i = 1; i < N-1; i++)
  86.      {
  87.          l[i] = 1.0 / (h * h);
  88.          d[i] = -(8.0 + h * h)/(4.0 * h * h);
  89.          u[i] = 1.0 / (h * h);
  90.          b[i] = 0.0;
  91.      }
  92.  
  93.      l[N-1] = 0.0;
  94.      d[N-1] = 1.0;
  95.      u[N-1] = 0.0;
  96.      b[N-1] = 0.0;
  97.  
  98.      algorytm_Thomasa();
  99.  
  100.      for(int i=0; i<N; i++)
  101.      {
  102.          blad[i] = fabs(x[i] - U(a));
  103.          a += h;   
  104.      }
  105.  
  106.      return najw_blad();
  107. }
  108.  
  109. double Dyskretyzacja::dyskretyzacja_Numerowa()
  110. {
  111.      double a = 0.0;
  112.  
  113.      dealokacja_pamieci();
  114.      alokacja_pamieci();
  115.  
  116.      l[0] = 0.0;
  117.      d[0] = 1.0;
  118.      u[0] = 0.0;
  119.      b[0] = 1.0;
  120.  
  121.      for(int i = 1; i < N - 1; i++)
  122.      {
  123.          l[i] = (48.0 - h * h) / (48.0 * h * h);
  124.          d[i] = (-48.0 - 5.0 * h * h) / (24.0 * h * h);
  125.          u[i] = (48.0 - h * h) / (48.0 * h * h);
  126.          b[i] = 0;
  127.      }
  128.  
  129.      l[N-1] = 0.0;
  130.      u[N-1] = 0.0;
  131.      d[N-1] = 1.0;
  132.      b[N-1] = 0.0;
  133.  
  134.      algorytm_Thomasa();
  135.  
  136.      for(int i = 0; i < N; i++)
  137.      {
  138.          blad[i] = fabs(x[i] - U(a));
  139.          a += h;   
  140.      }
  141.  
  142.      return najw_blad();
  143. }
  144.  
  145. void Dyskretyzacja::algorytm_Thomasa()
  146. {
  147.  double *r = new double[N];      
  148.  
  149.  for(int i = 1; i < N; i++)
  150.      d[i] = d[i] - (l[i] * u[i - 1]) / d[i - 1];
  151.  r[0] = b[0];
  152.  for(int i = 1; i < N; i++)
  153.      r[i] = b[i] - (l[i] * r[i - 1]) / d[i - 1];
  154.  x[N - 1] = r[N - 1] / d[N - 1];
  155.  for(int i = N - 2; i >= 0; i--)
  156.      x[i] = (r[i] - u[i] * x[i + 1]) / d[i];
  157.  
  158.  delete[] r;   
  159. }
  160.  
  161.  
  162. int main()
  163. {
  164.     Dyskretyzacja dys;
  165.     fstream plik;
  166.  
  167.     plik.open("wyniki.xls", ios::out);
  168.     if( plik.good() != true )
  169.         cout << "Nie uzyskano dostepu do pliku!" << endl;
  170.  
  171.     plik << "Krok;Metoda konwencjonalna;Metoda Numerowa" << endl;
  172.  
  173.     while(dys.dajN() < 3000)
  174.     {
  175.         plik << dys.dajH() << ";" << dys.dyskretyzacja_konwencjonalna() << ";" << dys.dyskretyzacja_Numerowa() << endl;
  176.         dys.ustawN(dys.dajN()+10);
  177.     }
  178.  
  179.     plik.close();
  180.     return 0;
  181. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top