五点三次平滑的程序源代码

问题

用五点三次平滑公式对等距点上的观测数据进行平滑。

算法分析

设已知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;
}

 

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值