爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 2075|回复: 0

C语言实现拉格朗日插值法和牛顿插值法

[复制链接]

新浪微博达人勋

发表于 2022-3-19 15:01:41 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
拉格朗日插值法的实现就是通过构造函数,通过已知几对数据然后估算输入对应的数据所得得值。
#include<stdio.h>
# define N 100       
int main()
{
    //设置数据;
        int n,i,j;double l[N],l1[N],l2[N],x,f=1.0,y=0 ,x1[N],y1[N];
        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[j]);//分子构造
                        if(i!=j)
                          {
                           l2=1.0*l2*(x1-x1[j]);//分母构造
                          }
                }
                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;
}
牛顿插值法:

                               
登录/注册后可看大图

                               
登录/注册后可看大图
&#8203;

                               
登录/注册后可看大图

                               
登录/注册后可看大图
&#8203;

                               
登录/注册后可看大图

                               
登录/注册后可看大图
&#8203;
以例子为例: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[N],n2;double x1[N],y1[N],x,y=0,w=1,k2[N],k3[N],k4[N],k5[N],k6[N],k7[N],k8[N],K9[N],k[N];
        //录入数据
    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[i+1]-y1)/(x1[i+1]-x1);
        }
        for(i=0;i<6;i++)
        {
                k3=1.0*(k2[i+1]-k2)/(x1[i+2]-x1);
        }
        for(i=0;i<5;i++)
        {
                k4=1.0*(k3[i+1]-k3)/(x1[i+3]-x1);
        }
        for(i=0;i<4;i++)
        {
                k5=1.0*(k4[i+1]-k4)/(x1[i+4]-x1);
        }
        for(i=0;i<3;i++)
        {
                k6=1.0*(k5[i+1]-k5)/(x1[i+5]-x1);

        }
        for(i=0;i<3;i++)
        {
                k7=1.0*(k6[i+1]-k6)/(x1[i+6]-x1);
        }
        for(i=0;i<2;i++)
        {
                k8=1.0*(k7[i+1]-k7)/(x1[i+7]-x1);
        }
        for(i=0;i<1;i++)
        {
                k8=1.0*(k5[i+1]-k5)/(x1[i+5]-x1);
        }
        printf("\n");
        printf("为了方便讨论,以第一个点为起始点,开始讨论");
        y=y1[0];
        //数据录入
        k[0]=k2[0];//起始点可更改,但为了方便,采取强制第一个
        k[1]=k3[0];
        k[2]=k4[0];
        k[3]=k5[0];
        k[4]=k6[0];
        k[5]=k7[0];
        k[6]=k8[0];
        for(i=0;i<n2;i++)
    {
            w=w*(x-x1);
            y=y+w*k;
    }
        printf("输出y结果为:%lf\n",y);
        return 0;
}
&#8203; 本代码进行强制默认,如需更改起始点,需注意更改后的点满足你所要进行的运算次数

密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表