Zorikto

lab4ASA(не раб)

Dec 21st, 2021 (edited)
327
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.03 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. using namespace std;
  4.  
  5. double p(double x) {
  6.     return 2 * x;
  7. }
  8.  
  9. double q(double x) {
  10.     return -1;
  11. }
  12.  
  13. double f(double x) {
  14.     return 0.4;
  15. }
  16.  
  17. void gauss(double** A, double* B, double* X, int n);
  18.  
  19. int main() {
  20.  
  21.     double alpha0 = 2; double alpha1 = 1; double Ac = 1;
  22.     double beta0 = 0; double beta1 = 1; double Bc = 2;
  23.     double a0 = 0.3; double b0 = 0.6;
  24.     int n = 3;
  25.  
  26.     //matrix A[n+1][n+1]
  27.     double** A = new double* [n + 1];
  28.     for (int i = 0; i < n + 1; i++) {
  29.         A[i] = new double[n + 1];
  30.     }
  31.  
  32.     //===
  33.     double* B = new double[n + 1]; //vector B[n+1]
  34.     double* X = new double[n + 1]; //vector X[n+1]
  35.  
  36.     //Сетка
  37.     double h = (b0 - a0) / n;
  38.     for (int i = 0; i <= n; i++) {
  39.         X[i] = a0 + i * h;
  40.         //cout << X[i] << endl;
  41.     }
  42.  
  43.     //===
  44.     cout << "h=" << h << endl;
  45.  
  46.     //calculate matrix A, B
  47.     for (int i = 0; i <= n - 2; i++) {
  48.         A[i][i] = h * h * q(X[i]) - h * p(X[i]) + 1;
  49.         A[i][i + 1] = h * p(X[i]) - 2;
  50.         A[i][i + 2] = 1;
  51.         B[i] = h * h * f(X[i]);
  52.     }
  53.     A[n - 1][0] = alpha0 * h - alpha1;
  54.     A[n - 1][1] = alpha1;
  55.     A[n][n - 1] = -beta1;
  56.     A[n][n] = beta0 * h + beta1;
  57.     B[n - 1] = h * Ac;
  58.     B[n] = h * Bc;
  59.     //===
  60.     //print A
  61.     for (int i = 0; i <= n; i++) {
  62.         for (int j = 0; j <= n; j++) {
  63.             cout << "A[" << i << "]" << "[" << j << "]=" << A[i][j] << " ";
  64.         }
  65.         cout << endl;
  66.     }
  67.     //===
  68.     cout << endl;
  69.     //print B
  70.     for (int i = 0; i <= n; i++) {
  71.         cout << "B[" << i << "]=" << B[i] << " ";
  72.     }
  73.     cout << endl;
  74.     cout << endl;
  75.     //===
  76.     //solve A*X1=B
  77.     double* X1 = new double[n + 1]; //vector X1[n+1]
  78.     gauss(A, B, X1, n + 1); //solve
  79.     //print X1
  80.     for (int i = 0; i <= n; i++) {
  81.         cout << "X1[" << i << "]=" << X1[i] << " ";
  82.     }
  83.     //===
  84.     return 0;
  85. }
  86.  
  87. void gauss(double** A, double* B, double* X, int n) {
  88.     int m = n + 1;
  89.     //create C[n][n+1]
  90.     double** C = new double* [n];
  91.     for (int i = 0; i < n; i++) {
  92.         C[i] = new double[n + 1];
  93.     }
  94.     //===
  95.     //split A and B to C
  96.     for (int i = 0; i < n; i++) {
  97.         for (int j = 0; j < n; j++) {
  98.             C[i][j] = A[i][j];
  99.         }
  100.         C[i][n] = B[i];
  101.     }
  102.     //===
  103.     /*
  104.     //print C
  105.     for(int i=0;i<n;i++){
  106.             for(int j=0;j<n+1;j++){
  107.                     cout << C[i][j] << " ";
  108.             }
  109.             cout << endl;
  110.     }
  111.     //===
  112.     */
  113.  
  114.     //forward
  115.     for (int k = 0; k < n - 1; k++) {
  116.         for (int i = k + 1; i < n; i++) {
  117.             for (int j = m - 1; j >= k; j--) {
  118.                 C[i][j] = C[i][j] - C[i][k] * C[k][j] / C[k][k];
  119.             }
  120.         }
  121.     }
  122.     //reverse
  123.     X[n - 1] = A[n - 1][m - 2] / A[n - 1][m - 2];
  124.  
  125.     for (int i = n - 2; i >= 0; i--) {
  126.         double s = 0;
  127.         for (int j = i + 1; j < m - 1; j++) {
  128.             s = s + C[i][j] * X[j];
  129.         }
  130.         X[i] = (C[i][m - 1] - s) / C[i][i];
  131.     }
  132.  
  133. }
Add Comment
Please, Sign In to add comment