Advertisement
Guest User

Untitled

a guest
May 19th, 2019
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.74 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <fstream>
  4. #include <iomanip>
  5. #define xPoczatkowe 0.1
  6. using namespace std;
  7. class macierz {
  8. public:
  9. double* D;
  10. double* U;
  11. double* L;
  12. int size;
  13. macierz(double * przekatna, double *przekatnaU,double *przekatnaL,int size) {
  14. this->size = size;
  15. D = new double[size];
  16. copy(przekatna,przekatna+size,D);
  17. U = new double[size-1];
  18. copy(przekatnaU,przekatnaU+size-1,U);
  19. L = new double[size-1];
  20. copy(przekatnaL,przekatnaL+size-1,L);
  21. }
  22. ~macierz() {
  23. delete [] D;
  24. delete [] L;
  25. delete [] U;
  26. }
  27. };
  28.  
  29. double wzorAnalityczny(double x) {
  30. return sin(x)-cos(x)+log(1.0/tan(x/2.0))*sin(x);
  31. }
  32.  
  33. double ctg(double x) {
  34. return 1.0 / tan(x);
  35. }
  36. void rozwiaz(macierz *m, double *b, double *x, int N) {
  37. for (int i = N - 1; i >= 0; --i) {
  38. x[i] = (b[i] - m->L[i] * x[i + 1]) / m->D[i];
  39. }
  40. }
  41. void algorytmThomasa(macierz *m, double *b, double *x, int N) {
  42. for (int i = 1; i < N; ++i)
  43. m->D[i] = m->D[i] - (m->U[i] * m->L[i - 1]) / m->D[i - 1];
  44. for (int i = 1; i < N; ++i)
  45. b[i] = b[i] - (m->U[i] * b[i - 1]) / m->D[i - 1];
  46. rozwiaz(m,b,x,N);
  47. }
  48.  
  49. double max(double *w, int size) {
  50. double max = fabs(w[0]);
  51. for (int i = 0; i < size; i++) {
  52. if (fabs(w[i]) > max) {
  53. max = fabs(w[i]);
  54. }
  55. }
  56. return max;
  57. }
  58.  
  59. double dyskretyzacjaNumerowa(double h, int N) {
  60. //inicjalizacja
  61. double xP = xPoczatkowe;
  62. double xP_kopia = xPoczatkowe;
  63. double *L = new double[N];
  64. double *D = new double[N];
  65. double *U = new double[N];
  66. double *b = new double[N];
  67. double *x = new double[N];
  68. double *BLEDY = new double[N];
  69. //warunki brzegowe
  70. U[0] = 0.0 / h;
  71. D[0] = 1.0 / h;
  72. b[0] = -0.5961798034812780886272;
  73. L[0] = 0;
  74. //uzupełnianie macierzy bez brzegow
  75. for (int i=1; i<N-1; i++) {
  76. L[i] = 1.0/(h*h)+1.0/12.0;
  77. D[i] = (-2.0*1.0)/(h*h)+1.0*(10.0/12.0);
  78. U[i] = 1.0/(h*h)+1.0/12.0;
  79. b[i] = -ctg(xP+i*h-h)/12.0-(10.0/12.0)*ctg(xP+i*h)-ctg(xP+i*h+h)/12.0;
  80. }
  81. //warunki brzegowe
  82. L[N-1] = 0.0/h;
  83. D[N-1] = 0.0/h+1.0;
  84. b[N-1] = 1.0;
  85. U[N-1] = 0;
  86. //rozwiazywanie
  87. macierz *m = new macierz(D,U,L,N);
  88. algorytmThomasa(m, b, x, N);
  89. //bledy
  90. for(int i=0; i<N; i++,xP+=h) {
  91. BLEDY[i]=fabs(x[i]-wzorAnalityczny(xP));
  92. }
  93. if (N == 60) {
  94. fstream wyjscie;
  95. wyjscie.open("numerow.txt", fstream::out);
  96. cout << endl << " Dyskretyzacja Numerowa " << endl;
  97. cout << " i punkt x[n] U(x) \n" << endl;
  98. for (int i = 0; i < N; i++) {
  99. wyjscie << xP_kopia << " " << x[i] << " " << wzorAnalityczny(xP_kopia) << " " << endl;
  100. if (i < 25)
  101. cout << setw(5) << i << setw(15) << xP_kopia << setw(15) << x[i] << setw(15) << wzorAnalityczny(xP_kopia) << endl;
  102. xP_kopia += h;
  103. }
  104. wyjscie.close();
  105. }
  106.  
  107. delete[] L;
  108. delete[] D;
  109. delete[] U;
  110. delete[] x;
  111. delete[] b;
  112. double maxError = max(BLEDY, N);
  113. delete[] BLEDY;
  114. return maxError;
  115. }
  116.  
  117. double dyskretyzacjaKonwencjonalna(double h, int N) {
  118. double *L = new double[N];
  119. double *D = new double[N];
  120. double *U = new double[N];
  121. double *b = new double[N];
  122. double *x = new double[N];
  123. double *BLEDY = new double[N];
  124. double xP = xPoczatkowe;
  125. double xP_kopia = xPoczatkowe;
  126. U[0] = 0.0/h;
  127. D[0] = 1.0/h;
  128. b[0] = -0.5961798034812780886272;
  129. L[0] = 0;
  130. for (int i=1; i<N-1; i++) {
  131. L[i] = 1.0/(h*h)-0.0/(2.0*h);
  132. D[i] = (-2.0*1.0)/(h*h)+1.0;
  133. U[i] = 1.0/(h*h)-0.0/(2.0*h);
  134. b[i] = -ctg(xP+i*h);
  135. }
  136. L[N-1] = 0.0/h;
  137. D[N-1] = 0.0/h+1.0;
  138. b[N-1] = 1.0;
  139. U[N-1] = 0;
  140. macierz *m = new macierz(D,U,L,N);
  141. algorytmThomasa(m, b, x, N);
  142. for (int i=0; i<N; i++,xP += h) {
  143. BLEDY[i] = fabs(x[i]-wzorAnalityczny(xP));
  144. }
  145. if (N == 60) {
  146. fstream wyjscie;
  147. wyjscie.open("konwencjonal.txt", fstream::out);
  148. cout << endl << " Dyskretyzacja Konwencjonalna " << endl;
  149. cout << " i punkt x[n] U(x) \n" << endl;
  150. for (int i = 0; i < N; i++) {
  151. BLEDY[i] = fabs(x[i] - wzorAnalityczny(xP_kopia));
  152. wyjscie << xP_kopia << " " << x[i] << " " << wzorAnalityczny(xP_kopia) << " " << endl;
  153. if (i < 25)
  154. cout << setw(5) << i << setw(15) << xP_kopia << setw(15) << x[i] << setw(15) << wzorAnalityczny(xP_kopia) << endl;
  155. xP_kopia += h;
  156. }
  157. wyjscie.close();
  158. }
  159. delete[] L;
  160. delete[] D;
  161. delete[] U;
  162. delete[] x;
  163. delete[] b;
  164. double maxError = max(BLEDY, N);
  165. delete[] BLEDY;
  166. return maxError;
  167. }
  168.  
  169. int main() {
  170. fstream wyjscie;
  171. wyjscie.open("bledy.txt", fstream::out);
  172.  
  173. for (int N = 10; N < 70000; N += 50) {
  174. double krok = (M_PI_2-xPoczatkowe)/(N-1);
  175. double konwencjonalna = dyskretyzacjaKonwencjonalna(krok, N);
  176. double numerowa = dyskretyzacjaNumerowa(krok, N);
  177. wyjscie << log10(krok) << " " << log10(konwencjonalna) << " " << log10(numerowa) << endl;
  178. }
  179. wyjscie.close();
  180. return 0;
  181. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement