牛顿插值法是数值分析中一种用于插值的多项式,由Issac Newton提出,是估算函数值的重要方法之一

前言

近期数值分析课程讲到了牛顿插值法,感觉比拉格朗日插值法更简单一些,出于兴趣便想用C++复现一下

GitHub地址

代码

#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
    double x[5],f[5][5],t;
    for(int i=0;i<=4;i++)
    {
        cout<<"input x"<<i<<"=";
        cin>>x[i];
        cout<<"input y"<<i<<"=";
        cin>>f[0][i];        
    }    
        cout<<"input x=";
    cin>>t;
        //输入x0-x4,y0-y4,x


    for(int i=1;i<=4;i++)
    {
        for(int j=i;j<=4;j++)
    {
        f[i][j]=(f[i-1][j]-f[i-1][j-1])/(x[j]-x[j-i]);
    }
       }
       //生成均差表


    double p=0;
    double k[5];
    k[0]=1;
    for(int i=1;i<=4;i++)
    {
        k[i]=k[i-1]*(t-x[i-1]);
    }
    for(int i=0;i<=4;i++)
    {
        p+=f[i][i]*k[i];
    }
    cout<<"p="<<p<<endl; //输出函数值p
    return 0;
}

解析

均差表的生成

均差表由一个二维数组f[][]存储
均差表
其中每项f的值为f[i][j]=(f[i-1][j]-f[i-1][j-1])/(x[j]-x[j-i])

函数P(x)的计算

函数p
笔者在处理每项fi后面的整式时将其设为k[i]并单独计算
其中规定k[0]=1
k的生成代码为k[i]=k[i-1]*(t-x[i-1])
再规定p的初始值为0
之后使用for循环将p的值累加即可得到最终答案

Last modification:September 23, 2022
如果觉得我的文章对你有用,请随意赞赏