C语言实现拉格朗日插值法和牛顿插值法
拉格朗日插值法的实现就是通过构造函数,通过已知几对数据然后估算输入对应的数据所得得值。#include<stdio.h>
# define N 100
int main()
{
//设置数据;
int n,i,j;double l,l1,l2,x,f=1.0,y=0 ,x1,y1;
printf("输入已知数据对数:");
scanf("%d",&n);
printf("输入一个x,输入一个y:");
for(i=0;i<n;i++)
{
//先输入一个x,再输入一个y
scanf("%lf",&x1);
scanf("%lf",&y1);
//将数据进行赋初值
l1=1;
l2=1;
}
printf("输入最后已知的x,求y:") ;//输入数据对
scanf("%lf",&x);
//赋初值
//进行l(x)的分子分母构造
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
l1=1.0*l1*(x-x1);//分子构造
if(i!=j)
{
l2=1.0*l2*(x1-x1);//分母构造
}
}
l1=1.0*l1/(x-x1);
l=1.0*l1/l2;
}
//计算得到y;
for(i=0;i<n;i++)
{
y=y+l*y1;
}
printf("%lf",y);
return 0;
}
牛顿插值法:
https://img-blog.csdnimg.cn/529c2c79ddb14d2098552ca5ca785f32.PNG?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LmF55u45aSE,size_20,color_FFFFFF,t_70,g_se,x_16data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==https://img-blog.csdnimg.cn/c0c903dd293d490f916185e60e0a5d20.PNG?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LmF55u45aSE,size_20,color_FFFFFF,t_70,g_se,x_16data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==https://img-blog.csdnimg.cn/d523df9e60064276a87f5ee9ffd8bfb7.PNG?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LmF55u45aSE,size_20,color_FFFFFF,t_70,g_se,x_16data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== 以例子为例:0.43505=(0.78846-0.87547)/(2.4-2.2),0.40010=(0.95551-0.87547)/(2.6-2.4)
一阶差商下列数类似,二阶差商:-0.087375=(0.40010-0.43505)/(2.6-2.4-(2.4-2.2) ,-0.073875=(0.37055-0.40010)/(2.8-2.6-(2.6-2.4)),三阶差商:0.02250=(-0.073875+0.087375)/(2.8-2.6-(2.6-2.4)-(2.4-2.2)
据此大家应该能总结出规律:
代码实现,在此说明,由于本人能力有限,这段代码写的非常不好,不能自由实现数据对的更改,但是可以告诉如何修改数据对个数:
#include<stdio.h>
# define N 100
int main()
{
int i,j,n=8,n1,n2;double x1,y1,x,y=0,w=1,k2,k3,k4,k5,k6,k7,k8,K9,k;
//录入数据
printf("本文以最多8组数据为例,已经满足问题讨论要求\n");//为了发现荣格现象
printf("请输入进行牛顿插值次数n2(n2<=n):");
scanf("%d",&n2);
/* for(i=0;i<8;i++)
{
n1=i;
}
*/
printf("请一组组数据输入,先输一个x,再输一个y:");
for(i=0;i<n;i++)
{
scanf("%lf",&x1);
scanf("%lf",&y1);
}
printf("输入x点:");
scanf("%lf",&x);
//若要换成八组以上基础数据,可将i<7换成你想要的i<?,后面需要加上k[],按照下面规律进行更改
for(i=0;i<7;i++)
{
k2=1.0*(y1-y1)/(x1-x1);
}
for(i=0;i<6;i++)
{
k3=1.0*(k2-k2)/(x1-x1);
}
for(i=0;i<5;i++)
{
k4=1.0*(k3-k3)/(x1-x1);
}
for(i=0;i<4;i++)
{
k5=1.0*(k4-k4)/(x1-x1);
}
for(i=0;i<3;i++)
{
k6=1.0*(k5-k5)/(x1-x1);
}
for(i=0;i<3;i++)
{
k7=1.0*(k6-k6)/(x1-x1);
}
for(i=0;i<2;i++)
{
k8=1.0*(k7-k7)/(x1-x1);
}
for(i=0;i<1;i++)
{
k8=1.0*(k5-k5)/(x1-x1);
}
printf("\n");
printf("为了方便讨论,以第一个点为起始点,开始讨论");
y=y1;
//数据录入
k=k2;//起始点可更改,但为了方便,采取强制第一个
k=k3;
k=k4;
k=k5;
k=k6;
k=k7;
k=k8;
for(i=0;i<n2;i++)
{
w=w*(x-x1);
y=y+w*k;
}
printf("输出y结果为:%lf\n",y);
return 0;
}
本代码进行强制默认,如需更改起始点,需注意更改后的点满足你所要进行的运算次数
页:
[1]