魏墨 发表于 2022-3-19 15:01:41

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]
查看完整版本: C语言实现拉格朗日插值法和牛顿插值法