Advertisement
dark-s0ul

Untitled

Dec 24th, 2017
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.62 KB | None | 0 0
  1. using namespace std;
  2.  
  3. #include <iostream>
  4. #include <iomanip>
  5. #include <cmath>
  6.  
  7. double f(double x){
  8.     return pow(M_E, (pow(x - 15, 0.25))) * sin(1.2 * x);
  9. }
  10.  
  11. double *slar(double a, double b, int N){
  12.     double *res = new double[N * (N + 1)] {0};
  13.     double h = (b - a) / (double) N;
  14.  
  15.     for (int i = 0; i < N; i++){
  16.         res[i * (N + 1) + i] = 4 * h;
  17.         if (i > 0) res[i * (N + 1) + i - 1] = h;
  18.         if (i < N - 1) res[i * (N + 1) + i + 1] = h;
  19.         double x_prev = a + h * (i - 1);
  20.         double x_i = a + h * i;
  21.         double x_next = a + h * (i + 1);
  22.         res[i * (N + 1) + N] = 6 * (f(x_next) - 2 * f(x_i) + f(x_prev)) / h;
  23.     }
  24.     return res;
  25. }
  26.  
  27.  
  28. double *gaus_jordan(double *A, int N) {
  29.     double *res = new double[N];
  30.     double coeficient;
  31.  
  32.     for (int k = 0; k < N; k++) {
  33.         coeficient = A[k * (N + 1) + k];
  34.         for (int j = 0; j < N + 1; j++) {
  35.             A[k * (N + 1) + j] = A[k * (N + 1) + j] / coeficient;
  36.         }
  37.  
  38.         for (int i = 0; i < N; i++) {
  39.             if (i == k) continue;
  40.             coeficient = A[i * (N + 1) + k];
  41.             for (int j = 0; j < N + 1; j++) {
  42.                 A[i * (N + 1) + j] -= A[k * (N + 1) + j] * coeficient;
  43.             }
  44.         }
  45.            
  46.     }
  47.  
  48.     for (int i = 0; i < N; i++) {
  49.         res[i] = A[i * (N + 1) + N];
  50.     }
  51.  
  52.     return res;
  53. }
  54.  
  55.  
  56. double* ai(double a, double b, int N){
  57.     double* A = new double[N];
  58.     double h = (b - a) / N;
  59.     double x = a;
  60.     for (int i = 0; i < N; ++i) {
  61.         A[i] = f(x);
  62.         x += h;
  63.     }
  64.     return A;
  65. }
  66.  
  67. double* di(double a, double b, double* C, int N){
  68.     double* D = new double[N];
  69.     double h = (b - a) / N;
  70.  
  71.     D[0] = C[0];
  72.     for (int i = 1; i < N; ++i) {
  73.         D[i] = (C[i] - C[i - 1]) / h;
  74.     }
  75.     return D;
  76. }
  77.  
  78. double* bi(double a, double b, double* C, double* D, int N){
  79.     double* B = new double[N];
  80.     double h = (b - a) / N;
  81.     B[0] = 0;
  82.  
  83.     for (int i = 1; i < N; ++i) {
  84.         B[i] = (h * C[i] / 2) - (h * h * D[i] / 2) + (f(a+h*i) - f(a+h*(i-1))) / h;
  85.     }
  86.  
  87.     return B;
  88. }
  89.  
  90. double spline(double x, double a, double b, double* A, double* B, double* C, double* D, int N){
  91.     double h = (b - a) / N;
  92.     int i = 0;
  93.  
  94.     while (x >= (a + i * h)) i++;
  95.     i--;
  96.  
  97.     double xi = a + i * h;
  98.  
  99.     return A[i] + B[i] * (x - xi) + C[i] * (x - xi) * (x - xi) / 2.0 + D[i] * (x - xi) * (x - xi) * (x - xi) / 6.0;
  100. }
  101.  
  102. int main(){
  103.     double a = 20, b = 30;
  104.     int N = 50;
  105.  
  106.     double *M = slar(a, b, N);
  107.     double *A = ai(a, b, N);
  108.     double *C = gaus_jordan(M, N);
  109.     double *D = di(a, b, C, N);
  110.     double *B = bi(a, b, C, D, N);
  111.  
  112.     int k = (b - a) * N + 1;
  113.     double step = (b - a) / (double)k;
  114.     double x = a, y;
  115.  
  116.     cout << "   X          Y" << endl;
  117.     for (int i = 0; i <= k; i++){
  118.         cout << setw(6) << x << setw(12) << spline(x, a, b, A, B, C, D, N) << endl;
  119.         x += step;
  120.     }
  121.  
  122.     return 0;
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement