Ladies_Man

num meth splines

Sep 23rd, 2016
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 8.04 KB | None | 0 0
  1. #include <iostream>
  2. #include <math.h>
  3. #include "stdio.h"
  4.  
  5. USING namespace std;
  6.  
  7. #define xtype DOUBLE
  8. #define N 10
  9.  
  10. xtype _a = 2.477520;
  11. xtype _b = 0.232206;
  12.  
  13.  
  14. xtype xs[] = {0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5};
  15. xtype ys[] = {2.78, 3.13, 3.51, 3.94, 4.43, 4.97, 5.58, 6.27, 7.04, 7.91, 8.89};
  16.  
  17. xtype xsNew[] = {0.50, 0.75, 1.00, 1.25, 1.50, 1.75, 2.00, 2.25, 2.50, 2.75, 3.00, 3.25, 3.50, 3.75, 4.00, 4.25, 4.50, 4.75, 5.00, 5.25, 5.50};
  18. xtype ysNew[] = {2.78, 2.95, 3.13, 3.31, 3.51, 3.72, 3.94, 4.18, 4.43, 4.69, 4.97, 5.27, 5.58, 5.92, 6.27, 6.65, 7.04, 7.47, 7.91, 8.38, 8.89};
  19.  
  20. xtype f(xtype x) { RETURN _a * EXP(_b*x); }
  21.  
  22. xtype h = xs[1] - xs[0];
  23.  
  24. typedef struct spline {
  25.     xtype a[N];
  26.     xtype b[N];
  27.     xtype c[N];
  28.     xtype d[N];
  29. } _spline;
  30.  
  31. typedef struct bispline {
  32.     xtype x[N+3];
  33. } _bispline;
  34.  
  35. typedef struct akame {
  36.     xtype a[N+4];
  37.     xtype b[N+4];
  38.     xtype c[N+4];
  39.     xtype d[N+4];
  40. } _akame;
  41.  
  42. void solveMatrix(INT n, xtype* a, xtype* b, xtype* c, xtype* d, xtype* x) {
  43.  
  44.     INT i;
  45.     xtype alpha[n], beta[n];
  46.     alpha[0] = -c[0] / b[0];
  47.     beta[0] = d[0] / b[0];
  48.  
  49.     FOR (i = 1; i < n-1; ++i) {
  50.         alpha[i] = (-c[i]) / (a[i] * alpha[i-1] + b[i]);
  51.         beta[i] = (d[i] - a[i] * beta[i-1]) / (a[i] * alpha[i-1] + b[i]);
  52.     }
  53.  
  54.     beta[n-1] = (d[n-1]-a[n-1] * beta[n-2]) / (a[n-1] * alpha[n-2] + b[n-1]);
  55.     x[n-1] = beta[n-1];
  56.  
  57.     FOR (i = n-2; i >= 0; --i) {
  58.         x[i] = alpha[i] * x[i+1] + beta[i];
  59.     }
  60. }
  61.  
  62. void solveMatrixNew(INT len, xtype* a, xtype* b, xtype* c, xtype* d, xtype* x) {
  63.  
  64.     INT SIZE = len;
  65.     INT n = SIZE - 1;
  66.     INT i;
  67.  
  68.     xtype alpha[SIZE], beta[SIZE];
  69.  
  70.     alpha[0] = -c[0] / b[0];
  71.     beta[0] = d[0] / b[0];
  72.  
  73.     FOR (i = 1; i <= n; i++) {
  74.         alpha[i] = (-c[i]) / (a[i] * alpha[i-1] + b[i]);
  75.         beta[i] = (d[i] - a[i] * beta[i-1]) / (a[i] * alpha[i-1] + b[i]);
  76.     }
  77.  
  78.     //beta[n-1] = (d[n-1]-a[n-1] * beta[n-2]) / (a[n-1] * alpha[n-2] + b[n-1]);
  79.     x[n+1] = beta[n];
  80.  
  81.     FOR (i = n; i >= 1; i--) {
  82.         x[i] = alpha[i-1] * x[i+1] + beta[i-1];
  83.     }
  84.     x[0] = 2*x[1] - x[2];
  85.     x[n+2] = 2*x[n+1] - x[n];
  86. }
  87.  
  88.  
  89.  
  90.  
  91. spline populateSpline(INT n) {
  92.  
  93.     xtype ak[n-3], bk[n-2], ck[n-3], dk[n-2], ek[n];
  94.     xtype a[n], b[n], c[n], d[n];
  95.  
  96.     xtype h = xs[1] - xs[0];
  97.  
  98.     FOR (INT i = 0; i < n - 2; i++) {
  99.  
  100.         IF (i < n-3)
  101.             ak[i] = ck[i] = 1;
  102.  
  103.         bk[i] = 4;
  104.         dk[i] = 3 / (h * h) * (ys[i+2] - 2*ys[i+1] + ys[i]);
  105.     }
  106.  
  107.     solveMatrix(n-2, ak, bk, ck, dk, ek);
  108.  
  109.  
  110.     c[0] = c[n-1] = 0;
  111.     FOR (INT i = 1; i < n-1; i++)
  112.         c[i] = ek[i-1];
  113.  
  114.     FOR (INT i = 0; i < n-1; i++) {
  115.         a[i] = ys[i];
  116.         b[i] = (ys[i+1] - ys[i]) / h - (h/3) * (c[i+1] + 2*c[i]);
  117.         d[i] = (c[i+1] - c[i]) / (3*h);
  118.     }
  119.  
  120.  
  121.     spline spZ;
  122.  
  123.     FOR (INT i = 0; i < n; i++) {
  124.         spZ.a[i] = a[i];
  125.         spZ.b[i] = b[i];
  126.         spZ.c[i] = c[i];
  127.         spZ.d[i] = d[i];
  128.     }
  129.     RETURN spZ;
  130. }
  131.  
  132. xtype countSplineAt(_spline spline, xtype x) {
  133.  
  134.     //S_j[x] = a_j + b_j(x-xj) + c_j(x-xj)^2 + d_j(x-xj)^3
  135.     INT i;
  136.     FOR (i = 0; i < N; ++i)
  137.         IF (x >= xs[i] && x <= xs[i+1])
  138.             break;
  139.  
  140.     IF (N == i) i--;
  141.  
  142.     //printf("cSA: %.6f\n", xsNew[i]);
  143.     //printf("[%d] %.6f %.6f \n",i, x, xsNew[i]);
  144.  
  145.     RETURN  spline.a[i] +
  146.             spline.b[i]*(x - xs[i]) +
  147.             spline.c[i]*(x - xs[i])*(x - xs[i]) +
  148.             spline.d[i]*(x - xs[i])*(x - xs[i])*(x - xs[i]);
  149. }
  150.  
  151.  
  152. xtype nFunc(INT q, INT k, xtype t) {
  153.  
  154.     IF (1 == q) {
  155.         IF (t >= xs[k] && t <= xs[k+1])
  156.             RETURN 1;
  157.         ELSE
  158.             RETURN 0;
  159.     }
  160.  
  161.     xtype n1 = nFunc(q-1, k, t) * (t - xs[k]) / (xs[k+q-1] - xs[k]);
  162.     xtype n2 = nFunc(q-1, k+1, t) * (xs[k+q] - t) / (xs[k+q] - xs[k+1]);
  163.  
  164.     RETURN n1 + n2;
  165. }
  166.  
  167.  
  168.  
  169. bispline populateBiSpline(INT len) {
  170.  
  171.     INT SIZE = len;
  172.     INT n = SIZE - 1;
  173.  
  174.     xtype a[SIZE], b[SIZE], c[SIZE], d[SIZE], e[SIZE+2];
  175.  
  176.     FOR (INT i = 1; i < n; i++) {
  177.         a[i] = 1;
  178.         b[i] = 4;
  179.         c[i] = 1;
  180.         d[i] = 6*ys[i];
  181.     }
  182.  
  183.     a[0] = 0;
  184.     b[0] = 1;
  185.     c[0] = 0;
  186.     d[0] = ys[0];
  187.  
  188.     a[n] = 0;
  189.     b[n] = 1;
  190.     c[n] = 0;
  191.     d[n] = ys[n-1];
  192.  
  193.     FOR (INT i = 0; i < n; i++) {
  194.         d[i] /= (h*h*h);
  195.     }
  196.  
  197.     solveMatrixNew(len, a, b, c, d, e);
  198.  
  199.  
  200.     _bispline bsp;
  201.  
  202.  
  203.     FOR (INT i = 0; i < SIZE+2; i++)
  204.         bsp.x[i] = e[i];
  205.  
  206.     RETURN bsp;
  207. }
  208.  
  209. xtype baseX(INT k, xtype x, xtype kh) {
  210.     IF (0 == k) {
  211.  
  212.         xtype xz = xs[0];
  213.  
  214.         IF (xz + 2*h <= x) RETURN 0;
  215.         IF (xz + h <= x && x < xz + 2*h) RETURN pow(2*h + xz - kh - (x - kh), 3)/6;
  216.         IF (xz <= x && x < xz + h)
  217.             RETURN 2*pow(h, 3)/3 - pow(-xz + kh + (x - kh), 2)*(2*h + xz - kh - (x - kh))/2;
  218.         IF (xz - h <= x && x < xz)
  219.             RETURN 2*pow(h, 3)/3 - pow(-xz + kh + (x - kh), 2)*(2*h - xz + kh + (x - kh))/2;
  220.         IF (xz - 2*h <= x && x < xz - h) RETURN pow(2*h - xz + kh + (x - kh), 3)/6;
  221.         IF (x < xz - 2*h) RETURN 0;
  222.  
  223.     } ELSE {
  224.         RETURN baseX(0, x - k*h, -k*h);
  225.     }
  226.  
  227. }
  228.  
  229. xtype countBiSplineAt(_bispline bsp, xtype val) {
  230.  
  231.     INT i;
  232.  
  233.     FOR (i = 0; i < N+2; ++i)
  234.         IF (xs[i] <= val && val <= xs[i+1])
  235.             break;
  236.  
  237.     IF (N+2 == i) i--;
  238.  
  239.     //printf("%.2f < %.2f < %.2f\n", xs[i], val, xs[i+1]);
  240.     //IF (xs[i] <= val && val <= xs[i+1]) {
  241.         RETURN  bsp.x[i + 0] * baseX(i - 1, val, 0) +
  242.                 bsp.x[i + 1] * baseX(i + 0, val, 0) +
  243.                 bsp.x[i + 2] * baseX(i + 1, val, 0) +
  244.                 bsp.x[i + 3] * baseX(i + 2, val, 0);
  245.     //} ELSE {
  246.     //    RETURN -1;
  247.     //}
  248. }
  249.  
  250.  
  251. akame populateAkame(INT n) {
  252.  
  253.     INT i;
  254.     xtype m[n + 4];
  255.     //-2;-1;    0.. n-1    ;n;n+1
  256.     FOR (i = 2; i < n + 2; i++) {
  257.         m[i] = (ys[i+1-2] - ys[i-2]) / (xs[i+1-2] - xs[i-2]);
  258.     }
  259.  
  260.     m[0] = 3*m[2] - 2*m[3]; //-2=0-1
  261.     m[1] = 2*m[2] - 2*m[3];
  262.     m[n+2] = 2*m[n+1] - 2*m[n];
  263.     m[n+3] = 3*m[n];
  264.  
  265.     xtype ne, alpha_i, h_i;
  266.     xtype t_l[n], t_r[n];
  267.  
  268.     FOR (i = 2; i < n + 2; i++) {
  269.         ne = fabs(m[i+1] - m[i]) + fabs(m[i-1] - m[i-2]);
  270.  
  271.         IF (ne > 0) {
  272.             alpha_i = fabs(m[i-1] - m[i-2]) / ne;
  273.             t_l[i] = m[i-1] + alpha_i*(m[i] - m[i-1]);
  274.             t_r[i] = t_l[i];
  275.         } ELSE {
  276.             t_l[i] = m[i-1];
  277.             t_r[i] = m[i];
  278.         }
  279.     }
  280.  
  281.     akame ga_spline;
  282.     FOR (i = 2; i < n+2; i++) {
  283.         h_i = xs[i+1-2] - xs[i-2];
  284.  
  285.         ga_spline.a[i] = ys[i-2];
  286.         ga_spline.b[i] = t_r[i];
  287.         ga_spline.c[i] = (3*m[i] - 2*t_r[i] - t_l[i+1]) / h_i;
  288.         ga_spline.d[i] = (t_r[i] + t_l[i+1] - 2*m[i]) / (h_i*h_i);
  289.     }
  290.  
  291.     RETURN ga_spline;
  292. }
  293.  
  294. xtype countAkameAt(akame ak, xtype x, INT i) {
  295.  
  296.     FOR (i = 0; i < N; ++i)
  297.         IF (x >= xs[i] && x <= xs[i+1])
  298.             break;
  299.  
  300.     RETURN  ak.a[i+2] +
  301.             ak.b[i+2]*(x - xs[i]) +
  302.             ak.c[i+2]*(x - xs[i])*(x - xs[i]) +
  303.             ak.d[i+2]*(x - xs[i])*(x - xs[i])*(x - xs[i]);
  304. }
  305.  
  306. INT f1() {
  307.     CHAR ch, ch1 = 'a', ch2 = 'b', ch3 = 'c';
  308.     ch = ch1 + ch2 + ch3;
  309.     //f1 = INT(ch);
  310.     //RETURN f1;
  311. }
  312.  
  313. INT SUM(INT START, INT END) {
  314.     IF (END == START)
  315.         RETURN 1;
  316.     ELSE
  317.         RETURN END + SUM(START, END - 1);
  318. }
  319.  
  320. INT main()
  321. {
  322.     printf("%d\n", SUM(1,3));
  323.  
  324.     printf("populating Spline\n");
  325.     spline sp = populateSpline(N+1);
  326.  
  327.     printf("populating Bispline\n");
  328.     bispline bs = populateBiSpline(N+2);
  329.  
  330.     printf("populating Akame ga Spline\n");
  331.     akame AS = populateAkame(N);
  332.  
  333.     FOR ( INT i = 0; i <= 2*N; i++) {
  334.  
  335.         xtype sVal = countSplineAt(sp, xsNew[i]);
  336.         xtype bsVal = countBiSplineAt(bs, xsNew[i]);
  337.         xtype asVal = countAkameAt(AS, xsNew[i], i);
  338.  
  339.         printf("x[%d]=%.2f y=%.5f \ts=%.5f d=%.5f \tbi=%.5f d=%.5f \ta=%.5f d=%.5f\n",
  340.                i, xsNew[i], ysNew[i],
  341.                sVal, fabs(ysNew[i] - sVal),
  342.                bsVal, fabs(ysNew[i] - bsVal),
  343.                asVal, fabs(ysNew[i] - asVal)
  344.                );
  345.     }
  346.     RETURN 0;
  347. }
Advertisement
Add Comment
Please, Sign In to add comment