Advertisement
Guest User

Untitled

a guest
May 23rd, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.29 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<math.h>
  3. #include<stdlib.h>
  4. #define pi  3.1415
  5. #define L  20
  6. #define T  18
  7.  
  8. double* mkarr(int n, int l)
  9. {
  10.     double* arr = (double*) malloc(l * n * sizeof(double));
  11.     return arr;
  12. }
  13. double* solve_analitic(double K, double h)
  14. {
  15.     double t = h * K;
  16.     int n = lround(T / t + 1);
  17.     int l = lround(L / h + 1);
  18.     double* arr = mkarr(n,l);
  19.  
  20.         for(int i = 0; i < l; i++)
  21.         for(int j = 0; j < n; j++) 
  22.             arr[j, i] = sin(4 * pi * (h * i - t * j)/ L);
  23.     return arr;
  24. }
  25. double* solve_corner(double K, double h)
  26. {
  27.     double t = h * K;
  28.     int n = lround(T / t + 1);
  29.     int l = lround(L / h + 1);
  30.     double* arr = mkarr(n, l);
  31.  
  32.     arr [0, 0] = 0;
  33.     for(int i = 0; i < l; i++)
  34.         arr[0, i] = sin(4 * pi * (i) * h/L);
  35.     for(int i = 1; i < n; i++)
  36.     {
  37.         arr[i, 0] = arr[i - 1, l] * t / h + arr[i - 1, 0] * (1-t / h);
  38.         for(int j = 0; j < l; j++)
  39.             arr[i, j] = arr[i - 1, j - 1] * t / h + arr[i - 1,j] * (1 - t / h);
  40.         arr[i,0] = arr[i, l - 1];
  41.     }
  42.     return arr;
  43. }
  44. double* solve_LV(double K, double h)
  45. {
  46.     double t = h * K;
  47.     int n = lround(T / t + 1);
  48.     int l = lround(L / h + 1);
  49.     double* arr = mkarr(n, l);
  50.     int j = 0;
  51.     arr[0, 0] = 0;
  52.         for(int i = 0; i < l; i++)
  53.             arr[0, i] = sin(4 * pi * i * h / L);
  54.         for(j = 1; j < l; j++)
  55.     {
  56.             arr[j, 0] = arr[j - 1,0] * (1 - t * t / h * h) + (arr[j - 1, 1] + arr[j - 1,n - 1]) * (t * t / 2 / h * h) - (arr[j,1] - arr[j - 1,n - 1]) * t / 2 /h;
  57.             for(int i = 1; i < n; i++)
  58.                 arr[j,i] = arr[j - 1,i] * (1 - t * t / h * h) + (arr[j - 1,i + 1] + arr[j - 1, i - 1]) * (t * t / 2 / h * h) - (arr[j - 1 , i + 1] - arr[j - 1, i - 1]) * t / 2 /h;
  59.     }
  60.     arr[j, n] = arr[j, 0];
  61.     return arr;
  62. }
  63.  
  64.  
  65. int main ()
  66. {
  67.     FILE* out = fopen("out.txt", "w");
  68.     if( out  == 0)
  69.         perror("err");
  70.     double K = 1;
  71.     double h = 0.5;
  72.     double t = h * K;
  73.     int n = lround(T / t + 1);
  74.     int l = lround(L / h + 1);
  75.         double* analitic = solve_analitic(K,h);
  76.     double* corner = solve_corner(K,h);
  77.     double* LV = solve_LV(K,h);
  78.     printf("%d %d \n", n, l);
  79.     int x = 0;
  80.     for (int i = 0; i < l; i++)
  81.     {
  82.         for(int j = 0; j < n; j++)
  83.         {
  84.             fprintf(out,"%f ",(analitic[i,j]));
  85.         }
  86.         x++;
  87.         fprintf(out, "\n");
  88.     }
  89.     printf("%d \n", x);
  90.     fclose(out);
  91.     free (analitic);
  92.     free (corner);
  93.     free (LV);
  94.     return 0;
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement