dark-s0ul

lab6

Dec 28th, 2017
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.75 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <math.h>
  4.  
  5. using namespace std;
  6.  
  7. #define N 1000
  8.  
  9. double Func(double x){
  10.     return log(x * x) * sin(x * 0.5) * exp(pow(x, 1.0 / 7.0));
  11. }
  12.  
  13. double *CoefA(double a, double b, int n){
  14.     double *A = new double[n];
  15.     double h = (b - a) / (double) n;
  16.     for(int i = 0; i < n; i++)  {
  17.         A[i] = Func(a + i * h);
  18.     }
  19.     return A;
  20. }
  21.  
  22. double **Matrix(double a, double b, int n) {
  23.     double h = (b - a) / (double)n;
  24.  
  25.     double **matrix = new double*[n];
  26.     for (int i = 0; i < n; i++) {
  27.         matrix[i] = new double[n + 1] {0};
  28.     }
  29.  
  30.     matrix[0][0]= 1;
  31.     matrix[n - 1][n - 1] = 1;
  32.  
  33.     for (int i = 1; i < n - 1; i++) {
  34.         for (int j = 0; j <= n; j++) {
  35.             matrix[i][j] = 0;
  36.             if (j == (i - 1)) matrix[i][j] = h;
  37.             if (j == i) matrix[i][j] = 4 * h;
  38.             if (j == (i + 1)) matrix[i][j] = h;
  39.             if (j == n) matrix[i][j] = 6 * (Func(a + h * (i - 1)) - 2 * Func(a + h * i) + Func(a + h * (i + 1)))/h;
  40.         }
  41.     }
  42.  
  43.     return matrix;
  44. }
  45.  
  46. double *CoefC(double a, double b, int n) {
  47.     double **matrix = Matrix(a, b, n);
  48.     double *C = new double[n];
  49.  
  50.     for (int k = 0; k < n - 1; k++){
  51.         double m = 1.0 / matrix[k][k];
  52.         for (int j = 0; j <= n; j++) {
  53.             matrix[k][j] = matrix[k][j] * m;
  54.         }
  55.  
  56.         for (int i = k + 1; i < n; i++){
  57.             double m = matrix[i][k];
  58.             for (int j = 0; j <= n; j++) {
  59.                 matrix[i][j] = matrix[i][j] - matrix[k][j] * m;
  60.             }
  61.         }
  62.     }
  63.  
  64.     for (int i = 0; i < n; i++) {
  65.         C[n - i - 1] = matrix[n - i - 1][n];
  66.         for (int j = 0; j < i; j++) {
  67.             C[n - i - 1] -= matrix[n - i - 1][n - 1 - j] * C[n - i];
  68.         }
  69.     }
  70.     return C;
  71. }
  72.  
  73. double *CoefD(double a, double b, double *C, int n){
  74.     double *D = new double[n];
  75.     double h = (b - a) / (double) n;
  76.  
  77.     D[0] = C[0];
  78.     for (int i = 1; i < n; i++) {
  79.         D[i] = (C[i] - C[i - 1]) / h;
  80.     }
  81.     return D;
  82. }
  83.  
  84. double *CoefB(double a, double b, double *C, double *D, int n){
  85.     double *B = new double[n];
  86.     double h = (b - a) / (double) n;
  87.     B[0] = 0;
  88.  
  89.     for(int i = 1; i < n; i++) {
  90.         B[i] = (h * C[i] / 2) - (h * h * D[i] / 2) + (Func(a + h * i) - Func(a + h * (i - 1))) / h;
  91.     }
  92.     return B;
  93. }
  94.  
  95. double Spline(double x, double a, double b, double *A, double *B, double *C, double *D, int n){
  96.     double h = (b - a) / (double) n;
  97.     int i = 0;
  98.  
  99.     while (x > (a + i * h)) i++;
  100.     --i;
  101.  
  102.     double xi = a + i * h;
  103.     return A[i] + B[i] * (x - xi) + C[i] * (x - xi) * (x - xi) / 2 + D[i] * (x - xi) * (x - xi) * (x - xi) / 6;
  104. }
  105.  
  106. int main(){
  107.     double a = 1, b = 35;
  108.  
  109.     double *A = CoefA(a, b, N);
  110.     double *C = CoefC(a, b, N);
  111.     double *D = CoefD(a, b, C, N);
  112.     double *B = CoefB(a, b, C, D, N);
  113.    
  114.     int k = (b - a) * 50;
  115.     double step = (b - a) / (double)k;
  116.     for (int i = 0; i <= k; i++) {
  117.         double x = a + i * step;
  118.         double y = Spline(x, a, b, A, B, C, D, N);
  119.  
  120.         printf("%4.2f %7f\n", x, y);
  121.     }
  122. }
Advertisement
Add Comment
Please, Sign In to add comment