Advertisement
Guest User

Untitled

a guest
May 19th, 2019
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.81 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement