样条之最小二乘算法求多项式

核心代码:

  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

时间: 2024-08-05 08:42:34

样条之最小二乘算法求多项式的相关文章

样条之切比雪夫算法求多项式

核心代码: 1 // 使用切比雪夫算法求多项式 2 void YcChebyshevFitSpline::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 m1,i,j,l,ii,k,im,ix[21]; 9 f

1127: 零起点学算法34——继续求多项式

1127: 零起点学算法34--继续求多项式 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 3481  Accepted: 1985[Submit][Status][Web Board] Description 输入1个正整数n, 计算1+(1+2)+(1+2+3)+...+(1+2+3+...+n) Input 输入正整数n(多组数据) Output 输出1+(1+2)+(1+2+3)+...+

1128: 零起点学算法35——再求多项式(含浮点)

1128: 零起点学算法35--再求多项式(含浮点) Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 2141  Accepted: 1002[Submit][Status][Web Board] Description 输入一个整数n,计算 1+1/(1-3)+1/(1-3+5)+...+1/(1-3+5-...+2n-1)的值 Input 输入一个整数n(多组数据) Output 出1+1/(1

1126: 零起点学算法33——求多项式

1126: 零起点学算法33--求多项式 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 2614  Accepted: 1356[Submit][Status][Web Board] Description 形如1-2+3-4...+n,你会编写吗? Input 输入1个正整数n(多组数据) n<=1000 Output 输出1-2+3-4...+n的值(每组数据一行) Sample Input

秦九韶算法求解多项式

秦九韶算法是中国南宋时期的数学家秦九韶提出的一种多项式简化算法.在西方被称作霍纳算法.它是一种将一元n次多项式的求值问题转化为n个一次式的算法. 一般地,一元n次多项式的求值需要经过[n(n+1)]/2次乘法和n次加法,而秦九韶算法只需要n次乘法和n次加法.其大大简化了计算过程,即使在现代,利用计算机解决多项式的求值问题时,秦九韶算法依然是最优的算法. 题目:写程序计算给定多项式在给定点x处的值 f(x) = a0 + a1x + … + an-1xn-1 + anxn 分析:对比使用常规算法和

Spark机器学习(10):ALS交替最小二乘算法

1. Alternating Least Square ALS(Alternating Least Square),交替最小二乘法.在机器学习中,特指使用最小二乘法的一种协同推荐算法.如下图所示,u表示用户,v表示商品,用户给商品打分,但是并不是每一个用户都会给每一种商品打分.比如用户u6就没有给商品v3打分,需要我们推断出来,这就是机器学习的任务. 由于并不是每个用户给每种商品都打了分,可以假设ALS矩阵是低秩的,即一个m*n的矩阵,是由m*k和k*n两个矩阵相乘得到的,其中k<<m,n.

*循环-08. 二分法求多项式单根

1 /* 2 * Main.c 3 * C8-循环-08. 二分法求多项式单根 4 * Created on: 2014年7月26日 5 * Author: Boomkeeper 6 *****部分通过******** 7 */ 8 #include <stdio.h> 9 #include <math.h> 10 11 float a3 = 0, a2 = 0, a1 = 0, a0 = 0; 12 13 double func(double x) { 14 return (a3

poj2187 求平面最远点对,garham_scan算法求凸包

poj2187 求平面最远点对,garham_scan算法求凸包 Beauty Contest Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 29666   Accepted: 9180 Description Bessie, Farmer John's prize cow, has just won first place in a bovine beauty contest, earning the title 'M

EM算法求高斯混合模型参数估计——Python实现

EM算法一般表述: 当有部分数据缺失或者无法观察到时,EM算法提供了一个高效的迭代程序用来计算这些数据的最大似然估计.在每一步迭代分为两个步骤:期望(Expectation)步骤和最大化(Maximization)步骤,因此称为EM算法. 假设全部数据Z是由可观测到的样本X={X1, X2,--, Xn}和不可观测到的样本Z={Z1, Z2,--, Zn}组成的,则Y = X∪Z.EM算法通过搜寻使全部数据的似然函数Log(L(Z; h))的期望值最大来寻找极大似然估计,注意此处的h不是一个变量