1、牛顿插值的作用
牛顿插值是用于拟合曲线--在有限个点的条件下,拟合出一条平滑的曲线
这里有个前提条件-输入的点必须无错误,也就是说牛顿插值并不能解决误差的问题
插值有两个,一个叫拉格朗日插值,一个是牛顿插值,牛顿插值优胜于拉格朗日插值法
2、一些事项
2.1、笔者认为,牛顿插值可以分成两:1、磋商,2、计算某个点对应的坐标值;考虑到提升CPU的性能,所以应当先进行磋商,把磋商后的结果储存起来,然后计算点时就用磋商值直接计算
2.2、注意:插值次数不能大于等于已知点的个数,但是与所查数列长度有关,因此最佳值应是已知点个数减一。
3、话不多说-代码:
3.1、算法函数
#define pointMax 6 //已知点的个数
//牛顿插值第一步计算-差商 输入 x轴数据,y轴数据,ff储存数组,num插值次数
void Newton1(float xx[],float yy[],float ff[pointMax][pointMax],int num)
{
unsigned char i,j;
if(pointMax <= num + 1)
num = pointMax - 1;
for(i=0;i<num+1;i++)
{
ff[0][i]=yy[i];
}
//差商 结果在 ff[i][i] 中
for(j=1;j<=num;j++)
for(i=j;i<=num;i++)
{
ff[j][i]=(ff[j-1][i-1]-ff[j-1][i])/(xx[i-j]-xx[i]);
}
}
//牛顿插值第二分部,返回结果 输入 x轴数据,ff储存数组,x轴查询值,num插值次数
float Newton2(float x[],float f[pointMax][pointMax], float x_aim,unsigned char num)
{
unsigned char i,j;
float result,product=1;
if(pointMax <= num + 1)
num = pointMax - 1;
result = f[0][0];
for(i=1;i<=num;i++)
{
product = f[j+1][j+1];
for(j=0;j<i;j++)
{
product = product * (x_aim - x[j]);
}
result += product;
}
return result;
}
3.2、调用算法函数计算
void main(void)
{
float x_aim;//任意x轴上的坐标点
float y_aim;//x轴上某点对应的Y轴的坐标点 - 计算结果
float x[pointMax] = {1,2,3,4,5,6};//已知x轴的坐标点-最好递增,不要有相等值
float y[pointMax] = {1,2,3,4,5,6};//已知y轴点,与上一行x轴要对应
float f[pointMax][pointMax];//储存磋商的值 其有效值在主对角线上
//如:一节磋商值 f[1][1] ,二姐磋商值 f[2][2] 等
Newton1(x,y,f,(pointMax-1));//磋商结果计算
while(1)
{
x_aim = 4.25;//输入要计算的x轴坐标值
y_aim = Newton2(x,f,x_aim,(pointMax-1));//计算:x_aim对应下的Y轴坐标
}
}