h1 { margin-bottom: 0.21cm }
h1.western { font-family: "Liberation Sans", sans-serif; font-size: 18pt }
h1.cjk { font-family: "Noto Sans CJK SC Regular"; font-size: 18pt }
h1.ctl { font-family: "Noto Sans CJK SC Regular"; font-size: 18pt }
p { margin-bottom: 0.25cm; line-height: 120% }

牛顿插值法

一、背景引入

相信朋友们,开了拉格朗日插值法后会被数学家的思维所折服,但是我想说有了拉格朗日插值法还不够,因为我们每次增加一个点都得重算所有插值基底函数,这样会增加计算量,下面我们引入牛顿插值法,这种插值法,添加一个插值结点我们只要做很小的变动便可以得到新的插值多项式。

二、理论推导

-均差的定义:

(一阶均差)

二阶均差为一阶均差再求均差。(显然是递推的)

一般地,函数f 的k阶均差定义为:

由均差的性质可以推导出:

k+1阶均差:

p { margin-bottom: 0.25cm; line-height: 120% }

(具体性质看:《数值分析:第5版》 page:30)

由均差的递推性,我们可以用以下表来求:

求表的公式:

table[i][j] = (table[i - 1][j] - table[i - 1][j - 1]) / (x[j] - x[j - i]);

p { margin-bottom: 0.25cm; line-height: 120% }

其中P(x) 为插值多项式,而R(x) 为插值余项。

所以p(x):

(由于图片问题此处P(x) 同N(x))

p { margin-bottom: 0.25cm; line-height: 120% }

三、代码实现

由以上推导可知,求牛顿插值多项式子主要就是求均差。

均差可由上表递推求得:

求表的公式:

table[i][j] = (table[i - 1][j] - table[i - 1][j - 1]) / (x[j] - x[j - i]);

#include <iostream>
using namespace std;
#include <vector>
inline double newton_solution(double x[], double y[], int n, double num, int newton_time)
{
    vector<vector<);
    ; i <= n; i++) {
        table[i].resize(n + );
    }
    ; i <= n; i++) table[][i] = y[i];
    ; i <= n; i++) {
        for (int j = i; j <= n; j++) {
            table[i][j] = (table[i - ][j] - table[i - ][j - ]) / (x[j] - x[j - i]);
        }
    }

    double res = 0.0;
    ; i <= newton_time; i++) {
        double temp = table[i][i];
        ; j < i; j++) {
            temp *= num - x[j];
        }
        res += temp;
    }

    return res;

}
int main(int argc, char const *argv[])
{
    ;
    cout << "插值节点个数-1:";
    cin >> n;
    ], y[n + ];
    cout << "\n请输入x[i]:";
    ; i <= n; i++) {
        cin >> x[i];
    }
    cout << "\n请输入y[i]:";
    ; i <= n; i++) {
        cin >> y[i];
    }
    ;
    cout << "\n请输入要求的点的x:";
    cin >> num;
    cout << "\n请输入所求的插值多项式次数:";
    ;
    cin >> newton_time;
    cout << newton_solution(x, y, n, num, newton_time) << endl;
    ;

牛顿插值法及其C++实现的更多相关文章

  1. 牛顿插值法——用Python进行数值计算

    拉格朗日插值法的最大毛病就是每次引入一个新的插值节点,基函数都要发生变化,这在一些实际生产环境中是不合适的,有时候会不断的有新的测量数据加入插值节点集, 因此,通过寻找n个插值节点构造的的插值函数与n ...

  2. Matlab数值计算示例: 牛顿插值法、LU分解法、拉格朗日插值法、牛顿插值法

    本文源于一次课题作业,部分自己写的,部分借用了网上的demo 牛顿迭代法(1) x=1:0.01:2; y=x.^3-x.^2+sin(x)-1; plot(x,y,'linewidth',2);gr ...

  3. 牛顿插值法(c++)【转载】

    摘自<c++和面向对象数值计算>,代码简洁明快,采用模板函数,通用性增强,牛顿差分合理利用存储空间,采用Horner算法(又称秦九韶算法)提高精度,减少时间复杂度,高!确实是高!对其中代码 ...

  4. 差分形式的牛顿插值法(c++)

    本程序对cosx函数进行插值,取步长为0.1,因此x的值为0.00,0.10,0.20,0.30,对应的y值为cos(0.00),cos(0.10),cos(0.20),cos(0.30),其实本程序 ...

  5. 牛顿插值法(c++)

    X Y 0.40 0.41075 0.55 0.57815 0.65 0.69675 0.80 0.88811 0.90 1.02652 1.05 1.25382 #include using nam ...

  6. CPP,MATLAB实现牛顿插值

    牛顿插值法的原理,在维基百科上不太全面,具体可以参考这篇文章.同样贴出,楼主作为初学者认为好理解的代码. function p=Newton1(x1,y,x2) %p为多项式估计出的插值 syms x ...

  7. 埃尔米特插值问题——用Python进行数值计算

    当插值的要求涉及到对插值函数导数的要求时,普通插值问题就变为埃尔米特插值问题.拉格朗日插值和牛顿插值的要求较低,只需要插值函数的函数值在插值点与被插函数的值相等,以此来使得在其它非插值节点插值函数的值 ...

  8. 风景区的面积及道路状况分析问题 test

    参考文献:   https://wenku.baidu.com/view/b6aed86baf1ffc4ffe47ac92.html #include <bits/stdc++.h> us ...

  9. ORACLE SQL 实现IRR的计算

    一.IRR计算的原理: 内部收益率(Internal Rate of Return (IRR)),就是资金流入现值总额与资金流出现值总额相等.净现值等于零时的折现率. 用公式 标识:-200+[30/ ...

随机推荐

  1. 201521123062《Java程序设计》第6周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 2. 书面作业 Q1.clone方法 1.1 Object ...

  2. 201521123042《Java程序设计》第13周学习总结

    本次作业参考文件 正则表达式参考资料 1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.bai ...

  3. ACM退役记&&回忆录

    ACM退役记 2017.9.19星期二,"九一八事变"八十六年后的第二天,永远记住这个日子,刚好是我报名ACM到现在,刚好满一年,而今天正是我注册杭州电子科技大学OJ的时间(就是这 ...

  4. Mybatis第三篇【动态SQL】

    动态SQL 何为动态SQL??回顾一下我们之前写的SSH项目中,有多条件查询的情况,如下图 我们当时刚开始做的时候,是需要在Controller中判断SQL是否已经有条件了,因为SQL语句需要拼接起来 ...

  5. WebUtils复用代码【request2Bean、UUID】

    request封装到Bean对象 public static <T> T request2Bean(HttpServletRequest httpServletRequest, Class ...

  6. python generator(生成器)

    a=(x*2 for x in range(1000)) # print(a.next())#python2使用 print(a.__next__()) #python3使用 print(next(a ...

  7. oracle pl/sql 基础

    一.pl/sql developer开发工具pl/sql developer是用于开发pl/sql块的集成开发环境(ide),它是一个独立的产品,而不是oracle的一个附带品. 二.pl/sql介绍 ...

  8. Jenkins定时任务

    Jenkins配置定时任务 选中Job名称--配置—构建触发器—勾选“Build periodically” 如图中配置所示:该任务每天上午7点定时执行一次. 官方说明翻译 MINUTE HOUR D ...

  9. 协议端口号(protocol port number)

    协议端口号(protocol port number) 先来个注意事项 (-> ->) 这种在协议层间的抽象的协议端口是软件端口,和硬件端口是完全不同的概念.硬件端口是不同设备进行交互的接 ...

  10. 《HelloGitHub》第 18 期

    <HelloGitHub>第 18 期 兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编程新手.热爱编程. ...