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

核心代码:

  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     float h[21],ha,hh,y1,y2,h1,h2,d,hm;
 10
 11     for (i=0; i<=m; i++)
 12     {
 13         a[i]=0.0;
 14     }
 15     if (m>=n)
 16     {
 17         m=n-1;
 18     }
 19     if (m>=20)
 20     {
 21         m=19;
 22     }
 23
 24     m1=m+1;
 25     ha=0.0f;
 26     ix[0]=0;
 27     ix[m]=n-1;
 28     l=(n-1)/m;
 29     j=l;
 30     for (i=1; i<=m-1; i++)
 31     {
 32         ix[i]=j; j=j+l;
 33     }
 34
 35     while (1==1)
 36     {
 37         hh=1.0f;
 38         for (i=0; i<=m; i++)
 39         {
 40             a[i]=YfGetFloatValue(valuesPtr, stride, ix[i]);
 41             h[i]=-hh;
 42             hh=-hh;
 43         }
 44
 45         for (j=1; j<=m; j++)
 46         {
 47             ii=m1;
 48             y2=a[ii-1];
 49             h2=h[ii-1];
 50             for (i=j; i<=m; i++)
 51             {
 52                 d=xStep*ix[ii-1] - xStep*ix[m1-i-1];
 53                 y1=a[m-i+j-1];
 54                 h1=h[m-i+j-1];
 55                 a[ii-1]=(y2-y1)/d;
 56                 h[ii-1]=(h2-h1)/d;
 57                 ii=m-i+j; y2=y1; h2=h1;
 58             }
 59         }
 60
 61         hh=-a[m]/h[m];
 62         for (i=0; i<=m; i++)
 63         {
 64             a[i]=a[i]+h[i]*hh;
 65         }
 66
 67         for (j=1; j<=m-1; j++)
 68         {
 69             ii=m-j;
 70             d=xStep*ix[ii-1];
 71             y2=a[ii-1];
 72             for (k=m1-j; k<=m; k++)
 73             {
 74                 y1=a[k-1];
 75                 a[ii-1]=y2-d*y1;
 76                 y2=y1; ii=k;
 77             }
 78         }
 79
 80         hm=fabs(hh);
 81         if (hm<=ha)
 82         {
 83             a[m]=-hm;
 84             return;
 85         }
 86
 87         a[m]=hm; ha=hm; im=ix[0]; h1=hh;
 88         j=0;
 89         for (i=0; i<=n-1; i++)
 90         {
 91             if (i==ix[j])
 92             {
 93                 if (j<m) j=j+1;
 94             }
 95             else
 96             {
 97                 h2=a[m-1];
 98                 for (k=m-2; k>=0; k--)
 99                 {
100                     h2=h2*xStep*i+a[k];
101                 }
102                 h2=h2-YfGetFloatValue(valuesPtr, stride, i);
103                 if (fabs(h2)>hm)
104                 {
105                     hm=fabs(h2);
106                     h1=h2;
107                     im=i;
108                 }
109             }
110         }
111         if (im==ix[0])
112         {
113             return;
114         }
115
116         i=0;
117         l=1;
118         while (l==1)
119         {
120             l=0;
121             if (im>=ix[i])
122             {
123                 i=i+1;
124                 if (i<=m)
125                 {
126                     l=1;
127                 }
128             }
129         }
130
131         if (i>m)
132         {
133             i=m;
134         }
135         if (i==(i/2)*2)
136         {
137             h2=-hh;
138         }
139         else
140         {
141             h2=hh;
142         }
143
144         if (h1*h2>=0.0f)
145         {
146             ix[i]=im;
147         }
148         else
149         {
150             if (im<ix[0])
151             {
152                 for (j=m-1; j>=0; j--)
153                 {
154                     ix[j+1]=ix[j];
155                 }
156                 ix[0]=im;
157             }
158             else
159             {
160                 if (im>ix[m])
161                 {
162                     for (j=1; j<=m; j++)
163                     {
164                         ix[j-1]=ix[j];
165                     }
166                     ix[m]=im;
167                 }
168                 else
169                 {
170                     ix[i-1]=im;
171                 }
172             }
173         }
174     }
175 }

切图:

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

时间: 2024-11-06 09:50:51

样条之切比雪夫算法求多项式的相关文章

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

核心代码: 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,

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 分析:对比使用常规算法和

*循环-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不是一个变量

算法 - 求两个自然数的最大公约数(C++)

placeholder算法 - 求两个自然数的最大公约数(C++),布布扣,bubuko.com