Advertisement
Guest User

Untitled

a guest
Feb 28th, 2020
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.28 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cmath>
  4. using namespace std;
  5.  
  6. vector<float> l;
  7. vector<float> x;
  8. vector<float> c;
  9. vector<float> b;
  10. vector<float> d;
  11. vector<float> lambda_;
  12. vector<float> sigma_;
  13.  
  14. float y(float t) {
  15.     return t * exp(t);
  16. }
  17.  
  18. void interpolate(float left, float right, int step) {
  19.     float h = (right - left) / (float)step;
  20.     float xx  = left;
  21.     while (xx < right + h) {
  22.         x.push_back(xx);
  23.         xx += h;
  24.     }
  25.  
  26.     for (int i = 1; i < x.size(); i++) {
  27.         l.push_back((y(x[i]) - y(x[i - 1])) / h);
  28.     }
  29.  
  30.     l.push_back(right);
  31.  
  32.     c.resize(step);
  33.     b.resize(step);
  34.     d.resize(step);
  35.  
  36.     lambda_.push_back(1.5 *((l[2] - l[1]) / h));
  37.     sigma_.push_back(- 1 / 4);
  38.  
  39.     //прогонка
  40.     for (int i = 2; i < x.size(); i++) {
  41.         sigma_.push_back((-h) / (2 * h + 2 * h + h * sigma_[i - 2]));
  42.         lambda_.push_back((3 * l[i] - 3 * l[i - 1] - h * lambda_[i - 2]) / (2 * h + 2 * h + h * sigma_[i - 2]));
  43.     }
  44.  
  45.     //обратная прогонка
  46.     for (int i = step - 1; i > 0; i--) {
  47.         c[i - 1] = sigma_[i - 1] * c[i] + lambda_[i - 1];
  48.     }
  49.  
  50.     for (int i = 1; i < step; i++) {
  51.         b[i] = (l[i] + (2 * c[i] * h + h * c[i - 1]) / 3);
  52.         d[i] = ((c[i] - c[i - 1]) / (3 * h));
  53.     }
  54. }
  55.  
  56. float getV(float v) {
  57.     for (int i = 1; i < x.size(); i++) {
  58.         if (v == x[0]) {
  59.             return y(x[0]);
  60.         } else if (i == x.size() - 1) {
  61.             return y(x.back());
  62.         } else if (x[i - 1] <= v && v <= x[i]) {
  63.             float u = (v - x[i]);
  64.             return y(x[i]) + b[i] * u + c[i] * u * u + d[i] * u * u * u;
  65.         }
  66.     }
  67. }
  68.  
  69. int main() {
  70.     interpolate(0, 1, 10);
  71.     vector<float> t;
  72.     float k = 0;
  73.     cout << "x: ";
  74.     while (k < 1.0) {
  75.         cout << k << " ";
  76.         k += 0.05;
  77.     }
  78.     cout << endl;
  79.  
  80.     k = 0;
  81.     cout << "y: ";
  82.     while (k < 1.0) {
  83.         cout << y(k) << " ";
  84.         k += 0.05;
  85.     }
  86.     cout << endl;
  87.  
  88.  
  89.     k = 0;
  90.     cout << "y*: ";
  91.     while (k < 1.0) {
  92.         cout << getV(k) << " ";
  93.         k += 0.05;
  94.     }
  95.     cout << endl;
  96.  
  97.     k = 0;
  98.     cout << "delta: ";
  99.     while (k < 1.0) {
  100.         cout << y(k) - getV(k) << " ";
  101.         k += 0.05;
  102.     }
  103.     cout << endl;
  104.  
  105.     return 0;
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement