问题
用五点三次平滑公式对等距点上的观测数据进行平滑。
算法分析
设已知n个等距点,上的观测(或实验)数据为x0<x1<…<xn-1,则可以在每个数据点的前后各取两个相邻的点,用三次多项式
Y=a0+a1x+a2x^2+a3x^3
进行逼近。
根据最小二乘原理确定出系数a0,a1,a2,a3,最后可得到五点三次平滑公式如下:
改公式要求数据点数n≥5,当数据点数多于5时,为对称考虑,除在两端分别用公式(4-1),(4-2)和(4-4),(4-5)外,其余都用公式(4-3)进行平滑,这就相当在每个子区间上用不同的三次最小二乘多项式进行平滑。
三、实例
设9个等距观测点上的数据y为54.0,145.0,227.0,359.0,401.0,342.0,259.0,112.0,65.0,用五点三次平滑公式对此9个观测数据进行平滑。
四、代码
#include "stdio.h"
/*形参与函数 参数意义
int n 给定等距观测点数。要求
double y[n] 存放n个等距观测点上的观测数据
doulilc yy[n] 返回n个等距观测点上的平滑结果
void kspt() 过程
*/
void kspt
(int n, double y[], double yy[])
{
if (n<5)
{
for (int i=0; i<= n-1; i++)
yy[i]=y[i];
}
else
{
yy[0] = 69.0*y[0] + 4.0*y[1] - 6.0*y[2] + 4.0*y[3] - y[4];
yy[0]=yy[0]/70.0;
yy[1]=2.0*y[0]+27.0*y[1]+12.0*y[2]-8.0*y[3];
yy[1]=(yy[1]+2.0*y[4])/35.0;
for (int i=2; i<=n-3; i++)
{
yy[i]=-3.0*y[i-2]+12.0*y[i-1]+17.0*y[i];
yy[i]=(yy[i]+12.0*y[i+1]-3.0*y[i+2])/35.0;
}
yy[n-2]=2.0*y[n-5]-8.0*y[n-4]+12.0*y[n-3];
yy[n-2]=(yy[n-2]+27.0*y[n-2]+2.0*y[n-1])/35.0;
yy[n-1]=-y[n-5]+4.0*y[n-4]-6.0*y[n-3];
yy[n-1]=(yy[n-1]+4.0*y[n-2]+69.0*y[n-1])/70.0;
}
return;
}