zoukankan      html  css  js  c++  java
  • 样条之最小二乘算法求多项式

     核心代码:

      1 // 使用最小二乘算法求多项式
      2 void YcLeastSquaresFitSpline::CalculateMultinomialValues(const void* valuesPtr, int stride, int n, int m, float* a) const
      3 {
      4     memset(a, 0, sizeof(float)*m);
      5 
      6     float xStep = 1.0f/(n - 1);
      7 
      8     int i,j,k;
      9     float z,p,c,g,q,d1,d2,s[20],t[20],b[20];
     10     for (i=0; i<=m-1; i++) 
     11     {
     12         a[i]=0.0f;
     13     }
     14 
     15     if (m>n) 
     16     {
     17         m=n;
     18     }
     19     if (m>20) 
     20     {
     21         m=20;
     22     }
     23 
     24     z=0.0f;
     25     for (i=0; i<=n-1; i++) 
     26     {
     27         z=z+xStep*i/(1.0f*n);
     28     }
     29 
     30     b[0]=1.0f; 
     31     d1=1.0f*n; 
     32     p=0.0f; 
     33     c=0.0f;
     34     for (i=0; i<=n-1; i++)
     35     { 
     36         p=p+(xStep*i-z); 
     37         c=c+YfGetFloatValue(valuesPtr, stride, i); 
     38     }
     39     c=c/d1; 
     40     p=p/d1;
     41     a[0]=c*b[0];
     42     if (m>1)
     43     { 
     44         t[1]=1.0f; 
     45         t[0]=-p;
     46         d2=0.0f; 
     47         c=0.0f; 
     48         g=0.0f;
     49 
     50         for (i=0; i<=n-1; i++)
     51         { 
     52             q=xStep*i-z-p; 
     53             d2=d2+q*q;
     54             c=c+YfGetFloatValue(valuesPtr, stride, i)*q;
     55             g=g+(xStep*i-z)*q*q;
     56         }
     57         c=c/d2; 
     58         p=g/d2; 
     59         q=d2/d1;
     60         d1=d2;
     61         a[1]=c*t[1]; 
     62         a[0]=c*t[0]+a[0];
     63     }
     64 
     65     for (j=2; j<=m-1; j++)
     66     { 
     67         s[j]=t[j-1];
     68         s[j-1]=-p*t[j-1]+t[j-2];
     69         if (j>=3)
     70         {
     71             for (k=j-2; k>=1; k--)
     72             {
     73                 s[k]=-p*t[k]+t[k-1]-q*b[k];
     74             }
     75         }
     76 
     77         s[0]=-p*t[0]-q*b[0];
     78         d2=0.0f; 
     79         c=0.0f; 
     80         g=0.0f;
     81         for (i=0; i<=n-1; i++)
     82         { 
     83             q=s[j];
     84             for (k=j-1; k>=0; k--)
     85             {
     86                 q=q*(xStep*i-z)+s[k];
     87             }
     88             d2=d2+q*q; 
     89             c=c+YfGetFloatValue(valuesPtr, stride, i)*q;
     90             g=g+(xStep*i-z)*q*q;
     91         }
     92 
     93         c=c/d2; 
     94         p=g/d2; 
     95         q=d2/d1;
     96         d1=d2;
     97         a[j]=c*s[j]; 
     98         t[j]=s[j];
     99         for (k=j-1; k>=0; k--)
    100         { 
    101             a[k]=c*s[k]+a[k];
    102             b[k]=t[k]; 
    103             t[k]=s[k];
    104         }
    105     }
    106 }

    切图:

     

     

    相关软件的下载地址为:http://files.cnblogs.com/WhyEngine/TestSpline.zip

  • 相关阅读:
    MDA模型定义及扩展
    java中 i = i++和 j = i++ 的区别
    nginx+tomcat负载均衡和session复制
    HDU 4010.Query on The Trees 解题报告
    codeforces 165D.Beard Graph 解题报告
    zoj 3209.Treasure Map(DLX精确覆盖)
    hdu 1155 Bungee Jumping
    选择Nginx的理由
    九九乘法表
    K
  • 原文地址:https://www.cnblogs.com/WhyEngine/p/4020432.html
Copyright © 2011-2022 走看看