Advertisement
Guest User

Untitled

a guest
Nov 19th, 2019
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.37 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <stdlib.h>
  5. #include "nrutil.h"
  6. #include "nr.h"
  7.  
  8. //#define N 20
  9. //#define a 0
  10. //#define b 1
  11.  
  12. int N=20;
  13. double a=0.0, b=1.0;
  14. double h;
  15. float *wezly;
  16. float *U;
  17. float *diag_diag;
  18. float *lower_diag;
  19. float *upper_diag;
  20. float *vec_S;
  21. float P_1(float t);
  22. float Q_1(float t);
  23. float F_1(float t);
  24. float U_1(float t);
  25.  
  26.  
  27. //int i,j,k,l,m,n,h=1.0/(N+1.0);
  28. //h=1/(N+1);
  29. float C1(int j,int i);
  30. float C1_falka(int j,int i);
  31. float C2(int j,int m,int i);
  32. float C2_falka(int j,int m,int i);
  33.  
  34.  
  35. float P_1(float t){return t*t;}
  36. float Q_1(float t){return t*t;}
  37. float U_1(float t){return t*t;}
  38. float F_1(float t){return t*t;}
  39.  
  40. /* run this program using the console pauser or add your own getch, system("pause") or input loop */
  41.  
  42. void metoda_galerkina(float(*U_2)(float),float(*P)(float),float(*Q)(float),float(*F)(float)){
  43. int k;
  44.  
  45. wezly=vector(0,N+1);
  46. U = vector(0,N+1);
  47.  
  48.  
  49. for(k=1; k<=N;wezly[k]=a+k*(b-a)/(N+1.0),k++);
  50.  
  51.  
  52.  
  53. float C1(j,i){
  54. if(i==j){return 2*h/3.0;}
  55. if(j-i > 1 || j-i < -1){return 0;}
  56. else{return h/6.0;}
  57. }
  58.  
  59. float C1_falka(j,i){
  60. if(i==j){return 2.0/h;}
  61. if(j-i > 1 || j-i < -1){return 0;}
  62. else{return (-1.0)/h;}
  63. }
  64.  
  65. float C2(j,m,i){
  66. if(i==j && j==m){return h/2.0;}
  67. if(abs(j-i)>1 || abs(j-m)>1 || abs(i-m)>1){return 0;}
  68. else{return h/12.0;}
  69. }
  70.  
  71. float C2_falka(j,m,i){
  72. if(i==j && j==m){return 0;}
  73. if(abs(j-i)>1 || abs(j-m)>1 || abs(i-m)>1){return 0;}
  74. if(j==m && m==i-1){return 1.0/3;}
  75. if(j==m && m==i+1){return (-1)/3.0;}
  76. if(j==i && m-1==i){return (-1)/6.0;}
  77. if(j==i && m+1==i){return 1.0/6;}
  78. if(j==m+1 && m+1==i+1){return (-1)/6.0;}
  79. if(j==m-1 && m-1==i-1){return 1.0/6;}
  80. }
  81.  
  82.  
  83. float *diag_diag = vector(1,N);
  84. float *lower_diag = vector(1,N);
  85. float *upper_diag = vector(1,N);
  86. float *vec_S = vector(1,N);
  87.  
  88. lower_diag[1] = 0;
  89.  
  90. upper_diag[N] = 0;
  91.  
  92.  
  93. diag_diag[1] = (-1)*C1_falka(1,1) + P_1(wezly[0])*C2_falka(1,0,1) + Q_1(wezly[0])*C2(1,0,1) + P_1(wezly[1])*C2_falka(1,1,1) + Q_1(wezly[1])*C2(1,1,1) + P_1(wezly[2])*C2_falka(1,2,1) + Q_1(wezly[2])*C2(1,2,1);
  94. upper_diag[1] = (-1)*C1_falka(1,2) + P_1(wezly[1])*C2_falka(1,1,2) + Q_1(wezly[1])*C2(1,1,2) + P_1(wezly[2])*C2_falka(1,2,2) + Q_1(wezly[2])*C2(1,2,2);
  95. lower_diag[N] = (-1)*C1_falka(N,N-1) + P_1(wezly[N-1])*C2_falka(N,N-1,N-1) + Q_1(wezly[N-1])*C2(N,N-1,N-1) + P_1(wezly[N])*C2_falka(N,N,N-1) + Q_1(wezly[N])*C2(N,N,N-1);
  96. diag_diag[N] = (-1)*C1_falka(N,N) + P_1(wezly[N-1])*C2_falka(N,N-1,N) + Q_1(wezly[N-1])*C2(N,N-1,N) + P_1(wezly[N])*C2_falka(N,N,N) + Q_1(wezly[N])*C2(N,N,N) + P_1(wezly[N+1])*C2_falka(N,N+1,N) + Q_1(wezly[N+1])*C2(N,N+1,N);
  97.  
  98. for(k=2;k=N-1;k++){
  99. lower_diag[k] = (-1)*C1_falka(k,k-1) + P_1(wezly[k-1])*C2_falka(k,k-1,k-1) + Q_1(wezly[k-1])*C2(k,k-1,k-1) + P_1(wezly[k])*C2_falka(k,k,k-1) + Q_1(wezly[k])*C2(k,k,k-1);
  100. diag_diag[k] = (-1)*C1_falka(k,k) + P_1(wezly[k-1])*C2_falka(k,k-1,k) + Q_1(wezly[k-1])*C2(k,k-1,k) + P_1(wezly[k])*C2_falka(k,k,k) + Q_1(wezly[k])*C2(k,k,k) + P_1(wezly[k+1])*C2_falka(k,k+1,k) + Q_1(wezly[k+1])*C2(k,k+1,k);
  101. upper_diag[k] = (-1)*C1_falka(k,k+1) + P_1(wezly[k])*C2_falka(k,k,k+1) + Q_1(wezly[k])*C2(k,k,k+1) + P_1(wezly[k+1])*C2_falka(k,k+1,k+1) + Q_1(wezly[k+1])*C2(k,k+1,k+1);
  102. }
  103.  
  104.  
  105. vec_S = vector(1,N);
  106. vec_S[1] = F_1(wezly[0])*C1(1,0) + F_1(wezly[1])*C1(1,1) + F_1(wezly[2])*C1(1,2) + U_1(a)*(C1_falka(1,0) - P_1(wezly[0])*C2_falka(1,0,0) - P_1(wezly[1])*C2_falka(1,1,0) - Q_1(wezly[0])*C2(1,0,0) - Q_1(wezly[1])*C2(1,1,0));
  107. vec_S[N] = F_1(wezly[N-1])*C1(N,N-1) + F_1(wezly[N])*C1(N,N) + F_1(wezly[N+1])*C1(N,N+1) + U_1(b)*(C1_falka(N,N+1) - P_1(wezly[N])*C2_falka(N,N,N+1) - P_1(wezly[N+1])*C2_falka(N,N+1,N+1) - Q_1(wezly[N])*C2(N,N,N+1) - Q_1(wezly[N+1])*C2(N,N+1,N+1));
  108.  
  109. int j;
  110. for(j=2;j=N-1;j++){
  111. vec_S[j] = F_1(wezly[j-1])*C1(j,j-1) + F_1(wezly[j])*C1(j,j) + F_1(wezly[j+1])*C1(j,j+1);
  112. }
  113.  
  114.  
  115. tridag(lower_diag, diag_diag, upper_diag, vec_S, U, N);
  116. }
  117.  
  118. int main() {
  119.  
  120. float *results = vector(1,N);
  121. float *check = vector(1,N);
  122.  
  123. int f;
  124. metoda_galerkina(U_1,P_1,Q_1,F_1);
  125.  
  126. for(f=1;f=N;f++){
  127. check[f] = U_1(wezly[f]) - U[f];}
  128.  
  129. return 0;
  130.  
  131. }
  132.  
  133.  
  134.  
  135.  
  136. // // wektor rozwiazan
  137. // U=dvector(0,N+1);
  138. //
  139. // // Alg Thomasa
  140. // beta=dvector(1,N);
  141. // gamma=dvector(1,N);
  142. //
  143. // // Wyliczane wartosci funkcji w punktach
  144. //
  145. // // Wektor wyrazow wolnych
  146. // D[1]=h*h*f[1]-(1-p[1]*h*0.5)*x_a;
  147. // D[N]=h*h*f[N+1]-(1-p[N]*h*0.5)*x_b;
  148. // for(int i=2; i<N; i++)
  149. // {
  150. // D[i]=h*h*f[i];
  151. // }
  152. //
  153. // // Tworzenie wektorow macierzy trojdiagonalnej
  154. // A[1]=0;
  155. // A[N]=(1-p[N]*h*0.5);
  156. // C[N]=0;
  157. // C[1]=(1+p[1]*h*0.5);
  158. // B[1]=(-2+q[1]*h*h);
  159. // B[N]=(-2+q[N]*h*h);
  160. //
  161. // for(int i=2;i<N;i++)
  162. // {
  163. // A[i]=(1-p[i]*h*0.5);
  164. // C[i]=(1+p[i]*h*0.5);
  165. // B[i]=(-2+q[i]*h*h);
  166. // }
  167. //
  168. // // Wyliczanie beta i gamma
  169. // beta[1]=-C[1]/B[1];
  170. // gamma[1]=D[1]/B[1];
  171. // for(int i=2;i<N+1;i++)
  172. // {
  173. // beta[i]=-C[i]/(A[i]*beta[i-1]+B[i]);
  174. // gamma[i]=(D[i]-A[i]*gamma[i-1])/(A[i]*beta[i-1]+B[i]);
  175. // }
  176. //
  177. // // Wyliczanie rozwiazan
  178. // U[0]=x_a;
  179. // U[N+1]=x_b;
  180. // U[N]=gamma[N];
  181. //
  182. // for(int i=N-1; i>0; i--)
  183. // {
  184. // U[i]=beta[i]*U[i+1]+gamma[i];
  185. // }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement