Advertisement
Roulett

McKormack new

May 25th, 2020
2,224
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.65 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <iostream>
  3. #include<stdio.h>
  4. #include <math.h>
  5. #include <fstream>
  6. using namespace std;
  7.  
  8. int N;
  9. double h, tau;
  10.  
  11. //Точное решение
  12.  
  13. double U(double X, double T) {
  14.     if (X + T <= 1) {
  15.         if (T >= X) return 1;
  16.         return (1 - 2 * X);
  17.     }
  18.     else if (X + T > 1)
  19.         return -1;
  20.     else return 0;
  21. }
  22.  
  23. double max(double *u2[], int N, int M) {
  24.     double max = u2[0][0];
  25.     for (int i = 1; i < N + 1; i++) {
  26.         for (int j = 0; j < M + 1; j++)
  27.             if (max < u2[i][j]) {
  28.                 max = u2[i][j];
  29.             }
  30.     }
  31.     return max;
  32. }
  33.  
  34. double f2(double *u[], int N, int M, double h, double tau) {
  35.     u[0][0] = 1;//точка разрыва (для гладкого условия просто значение 1)
  36.     u[N][M] = 1;//точка разрыва, перенесённая по характеристике на правую границу
  37.     for (int i = 1; i < N + 1; i++) {//Н.У
  38.         u[i][0] = cos(3.14159*(i*h));
  39.         //u[i][0] = 0;
  40.     }
  41.     for (int i = 1; i < M + 1; i++) {//К.У слева
  42.         u[0][i] = exp(-i * tau);
  43.         //u[0][i] = 1;
  44.     }
  45.     for (int i = 1; i < M; i++) {// К.У справа
  46.         u[N][i] = cos(3.14159*(1 - i * tau));
  47.         //u[N][i] = 0;
  48.     }
  49.     for (int i = 1; i < N; i++) {// двухслойная схема для второго (первого после нулевого) слоя
  50.         u[i][1] = u[i - 1][0] + (tau - h) / (h + tau)*u[i][0] - (tau - h) / (h + tau)*u[i - 1][1];
  51.     }
  52.     double **u2 = new double*[N + 1];//погрешность в узлах
  53.     for (int k = 0; k < N + 1; k++) {
  54.         u2[k] = new double[M + 1];
  55.     }
  56.     for (int i = 0; i < N + 1; i++) {
  57.         for (int j = 0; j < M + 1; j++) {
  58.             u2[i][j] = fabs(U(i, j) - u[i][j]);
  59.         }
  60.     }
  61.     double maxpogr;
  62.     maxpogr = max(u2, N, M);
  63.     for (int d = 0; d < N + 1; d++) {
  64.         delete[] u2[d];
  65.     }
  66.     return maxpogr;
  67. }
  68.  
  69. //Функция дл создания массива
  70. double **cr_arr(size_t a, size_t b) {
  71.     double **m = new double*[a];
  72.     m[0] = new double[a*b];
  73.     for (size_t i = 1; i != a; ++i) {
  74.         m[i] = m[i - 1] + b;
  75.  
  76.     }
  77.     return m;
  78. }
  79.  
  80. //Заполняем массив чиселками
  81. double ** fill_ar() {
  82.     double **u = cr_arr(N + 1, N + 1);
  83.     //у1-с волной, у2 - с чертой
  84.     double *u1 = new double[N + 1], *u2 = new double[N + 1];
  85.     for (int i = 0; i < N + 1; i++) {//Н.У
  86.         u[i][0] = -2 * i * h + 1;
  87.     }
  88.     for (int i = 1; i < N + 1; i++) {//К.У слева
  89.         u[0][i] = 1;
  90.     }
  91.     for (int i = 1; i < N + 1; i++) {// К.У справа
  92.         u[N][i] = -1;
  93.     }
  94.     for (int m = 0; m < N; m++) {
  95.         u1[0] = tau * (u[0][m] * u[0][m] - u[1][m] * u[1][m]) / (2.*h) + u[0][m];
  96.         for (int j = 1; j < N; j++) {
  97.             u1[j] = tau * (u[j][m] * u[j][m] - u[j + 1][m] * u[j + 1][m]) / (2.*h) + u[j][m];
  98.             u2[j] = u[j][m] - tau * u1[j] * u1[j] / (2.*h) + tau * u1[j - 1] * u1[j - 1] / (2.*h);
  99.             u[j][m + 1] = (u1[j] + u2[j]) / 2.;
  100.         }
  101.     }
  102.     return(u);
  103. }
  104.  
  105. int main() {
  106.     FILE *ux8, *ut8, *ux, *ut, *ut_err, *ux_err;
  107.     ux8 = fopen("ux8.txt", "w+");
  108.     ut8 = fopen("ut8.txt", "w+");
  109.     ux = fopen("ux.txt", "w+");
  110.     ut = fopen("ut.txt", "w+");
  111.     ut_err = fopen("ut_err.txt", "w+");
  112.     ux_err = fopen("ux_err.txt", "w+");
  113.     double **u, ux_er = 0, ut_er = 0, u_err = 0;
  114.     N = 10;
  115.     for (int k = 0; k < 3; k++) {
  116.         h = 1 / (double)(N), tau = 1 / (double)N;
  117.         u = fill_ar();
  118.         for (int i = 0; i <N + 1; i++) {
  119.             for (int j = 0; j < N + 1; j++) {
  120.                 if (h*i == 0.5)
  121.                     fprintf(ut, "%0.5lf %0.5lf \n", j*tau, u[i][j]);
  122.                 if (tau*j == 0.5)
  123.                     fprintf(ux, "%0.5lf %0.5lf \n", i*h, u[i][j]);
  124.                 if (tau*j == 0.8)
  125.                     fprintf(ux8, "%0.5lf %0.5lf \n", i*h, u[i][j]);
  126.                 if (h*i == 0.8)
  127.                     fprintf(ut8, "%0.5lf %0.5lf \n", j*tau, u[i][j]);
  128.                 if (fabs(u[i][j] - U(i*h, j*tau)) >= u_err)
  129.                     u_err = fabs(u[i][j] - U(i*h, j*tau));
  130.             }
  131.             ux_er = u_err;
  132.         }
  133.         for (int j = 0; j < N + 1; j++) {
  134.             for (int i = 0; i < N + 1; i++) {
  135.                 if (fabs(u[i][j] - U(i*h, j*tau)) >= u_err)
  136.                     u_err = fabs(u[i][j] - U(i*h, j*tau));
  137.             }
  138.             ut_er = u_err;
  139.         }
  140.         fprintf(ux_err, "N = %d  %0.5lf\n", N, ux_er);
  141.         fprintf(ut_err, "N = %d  %0.5lf\n", N, ut_er);
  142.         N = N * 10;
  143.  
  144.     }
  145.     fclose(ux);
  146.     fclose(ut);
  147.     fclose(ux8);
  148.     fclose(ut8);
  149.     return 0;
  150. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement