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

因此,通过寻找n个插值节点构造的的插值函数与n+1个插值节点构造的插值函数之间的关系,形成了牛顿插值法。推演牛顿插值法的方式是归纳法,也就是计算Ln(x)- Ln+1(x),并且从n=1开始不断的迭代来计算n+1时的插值函数。

牛顿插值法的公式是:

注意:在程序中我用W 代替

计算牛顿插值函数关键是要计算差商,n阶差商的表示方式如下:

关于差商我在这里并不讨论

计算n阶差商的公式是这样:

很明显计算n阶差商需要利用到两个n-1阶差商,这样在编程的时候很容易想到利用递归来实现计算n阶差商,不过需要注意的是递归有栈溢出的潜在危险,在计算差商的时候

更是如此,每一层递归都会包含两个递归,递归的总次数呈满二叉树分布:

这意味着递归次数会急剧增加:(。所以在具体的应用中还需要根据应用来改变思路或者优化代码。

废话少说,放码过来。

首先写最关键的一步,也就是计算n阶差商:

"""

@brief: 计算n阶差商 f[x0, x1, x2 ... xn]

@param: xi 所有插值节点的横坐标集合 o

@param: fi 所有插值节点的纵坐标集合 / \

@return: 返回xi的i阶差商(i为xi长度减1) o o

@notice: a. 必须确保xi与fi长度相等 / \ / \

b. 由于用到了递归,所以留意不要爆栈了. o o o o

c. 递归减递归(每层递归包含两个递归函数), 每层递归次数呈二次幂增长,总次数是一个满二叉树的所有节点数量(所以极易栈溢出)

"""

def get_order_diff_quot(xi = [], fi = []):

if len(xi) > 2 and len(fi) > 2:

return (get_order_diff_quot(xi[:len(xi) - 1], fi[:len(fi) - 1]) - get_order_diff_quot(xi[1:len(xi)], fi[1:len(fi)])) / float(xi[0] - xi[-1])

return (fi[0] - fi[1]) / float(xi[0] - xi[1])

看上面的牛顿插值函数公式,有了差商,还差

这个就比较好实现了:

"""

@brief: 获得Wi(x)函数;

Wi的含义举例 W1 = (x - x0); W2 = (x - x0)(x - x1); W3 = (x - x0)(x - x1)(x - x2)

@param: i i阶(i次多项式)

@param: xi 所有插值节点的横坐标集合

@return: 返回Wi(x)函数

"""

def get_Wi(i = 0, xi = []):

def Wi(x):

result = 1.0

for each in range(i):

result *= (x - xi[each])

return result

return Wi

OK, 牛顿插值法最重要的两部分都有了,下面就是将这两部分组合成牛顿插值函数,如果是c之类的语言就需要保存一些中间数据了,我利用了Python的闭包直接返回一个牛顿插值函数,闭包可以利用到它所处的函数之中的上下文数据。

"""

@brief: 获得牛顿插值函数

@

"""

def get_Newton_inter(xi = [], fi = []):

def Newton_inter(x):

result = fi[0]

for i in range(2, len(xi)):

result += (get_order_diff_quot(xi[:i], fi[:i]) * get_Wi(i-1, xi)(x))

return result

return Newton_inter

上面这段代码就是对牛顿插值函数公式的翻译,注意get_Wi函数的参数是i-1,这个从

函数的表达式可以找到原因。

构造一些插值节点

''' 插值节点, 这里用二次函数生成插值节点,每两个节点x轴距离位10 '''

sr_x = [i for i in range(-50, 51, 10)]

sr_fx = [i**2 for i in sr_x]

获得牛顿插值函数

Nx = get_Newton_inter(sr_x, sr_fx) # 获得插值函数

tmp_x = [i for i in range(-50, 51)] # 测试用例

tmp_y = [Nx(i) for i in tmp_x] # 根据插值函数获得测试用例的纵坐标

完整代码:

# -*- coding: utf-8 -*-

"""

Created on Thu Nov 17 18:34:21 2016

@author: tete

@brief: 牛顿插值法

"""

import matplotlib.pyplot as plt

"""

@brief: 计算n阶差商 f[x0, x1, x2 ... xn]

@param: xi 所有插值节点的横坐标集合 o

@param: fi 所有插值节点的纵坐标集合 / \

@return: 返回xi的i阶差商(i为xi长度减1) o o

@notice: a. 必须确保xi与fi长度相等 / \ / \

b. 由于用到了递归,所以留意不要爆栈了. o o o o

c. 递归减递归(每层递归包含两个递归函数), 每层递归次数呈二次幂增长,总次数是一个满二叉树的所有节点数量(所以极易栈溢出)

"""

def get_order_diff_quot(xi = [], fi = []):

if len(xi) > 2 and len(fi) > 2:

return (get_order_diff_quot(xi[:len(xi) - 1], fi[:len(fi) - 1]) - get_order_diff_quot(xi[1:len(xi)], fi[1:len(fi)])) / float(xi[0] - xi[-1])

return (fi[0] - fi[1]) / float(xi[0] - xi[1])

"""

@brief: 获得Wi(x)函数;

Wi的含义举例 W1 = (x - x0); W2 = (x - x0)(x - x1); W3 = (x - x0)(x - x1)(x - x2)

@param: i i阶(i次多项式)

@param: xi 所有插值节点的横坐标集合

@return: 返回Wi(x)函数

"""

def get_Wi(i = 0, xi = []):

def Wi(x):

result = 1.0

for each in range(i):

result *= (x - xi[each])

return result

return Wi

"""

@brief: 获得牛顿插值函数

@

"""

def get_Newton_inter(xi = [], fi = []):

def Newton_inter(x):

result = fi[0]

for i in range(2, len(xi)):

result += (get_order_diff_quot(xi[:i], fi[:i]) * get_Wi(i-1, xi)(x))

return result

return Newton_inter

"""

demo:

"""

if __name__ == '__main__':

''' 插值节点, 这里用二次函数生成插值节点,每两个节点x轴距离位10 '''

sr_x = [i for i in range(-50, 51, 10)]

sr_fx = [i**2 for i in sr_x]

Nx = get_Newton_inter(sr_x, sr_fx) # 获得插值函数

tmp_x = [i for i in range(-50, 51)] # 测试用例

tmp_y = [Nx(i) for i in tmp_x] # 根据插值函数获得测试用例的纵坐标

''' 画图 '''

plt.figure("I love china")

ax1 = plt.subplot(111)

plt.sca(ax1)

plt.plot(sr_x, sr_fx, linestyle = '', marker='o', color='b')

plt.plot(tmp_x, tmp_y, linestyle = '--', color='r')

plt.show()

牛顿插值法python代码_牛顿插值法——用Python进行数值计算相关推荐

  1. 聚类 python 代码_不足 20 行 Python 代码,高效实现 k-means 均值聚类算法

    下载好向圈APP可以快速联系圈友 您需要 登录 才可以下载或查看,没有帐号?立即注册 x 不足 20 行 Python 代码,高效实现 k-means 均值聚类算法-1.jpg (143.81 KB, ...

  2. pycharm写python代码_使用pycharm写python代码的一些提高效率的技巧(持续更新)-Go语言中文社区...

    这篇博客主要是用来记录自己在学习pycharm时发现的一些能够提高编写python代码效率的小技巧. 1.问题:在代码很多的情况下,调用函数时想看看函数的参数以及函数内容,按ctrl+鼠标左键虽然进入 ...

  3. 如何修改python代码_解决如何去除Python代码前行号的方法

    获取Python脚本代码前行号的方法我们已经知道了,那如何去除Python脚本代码前行号的方法又是怎样的呢?今天我们就来为大家写个实例代码来看下. 刚刚接触Python时,因为经常要在网上拷贝别人的代 ...

  4. 手机如何看python代码_用手机运行Python代码

    前言 在手机上运行Python需要用一个软件,叫QPython3L,当然还有别的软件也是可以运行Python的,不过我认为QPython3L是其中相对较好的一个. 首先声明一下,我也只是会简单的使用 ...

  5. 在树莓派里面运行python代码_树莓派如何运行python程序

    树莓派如何运行python程序 发布时间:2020-09-23 12:03:39 来源:亿速云 阅读:128 作者:小新 这篇文章主要介绍了树莓派如何运行python程序,具有一定借鉴价值,需要的朋友 ...

  6. 交叉验证python代码_交叉验证以及python代码实现

    这篇文章介绍的内容是关交叉验证以及python代码实现 ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 模型选择的两种方法:正则化(典型方法).交叉验证. 这里介绍交叉验证及其pyth ...

  7. 怎么读python代码_【怎么读python代码】作文写作问答 - 归教作文网

    python怎么读 python : 发音:英 [ˈpaɪθən] 美 [ˈpaɪθɑ:n] 中文释义:巨蛇,大蟒 复数形式:pythons 英文单词,意为巨蛇,大蟒. 扩展资料: 例句如下:When ...

  8. 微信跳一跳python代码_微信跳一跳python程序

    #源码下载地址:https://files.cnblogs.com/files/cnfan/jump.rar importosimportcv2importnumpy as npimporttimei ...

  9. vim 编写python代码_用Vim编写Python代码

    关于vim是什么?vim与Emacs的区别?请见下面的文章 编辑器圣战-神秘的程序员&version=12020010&nettype=WIFI&fontScale=100&a ...

  10. 如何让nginx执行python代码_生产环境部署Python语言代码(django+uwsgi+nginx)

    本文主要向大家介绍了生产环境部署Python语言代码(django+uwsgi+nginx),通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 基础环境不做介绍,在django开发w ...

最新文章

  1. java el表达式 导航规则_诺禾:在jsp里面如何不写java代码展示数据(EL表达式的使用)...
  2. 如何使用subversion管理iOS源代码
  3. 这些令人仰望的C++大咖,都是怎样炼成的?
  4. [渝粤教育] 盐城工学院 环境监测与仪器分析 参考 资料
  5. 集算器访问HTTP数据的代码示例
  6. 彻底搞懂 Scrapy 的中间件
  7. n卡eth挖矿设置_ETH2.0要来了,要不要布局显卡挖矿?
  8. java 改变文件路径_在C#中改变文件路径
  9. neo4j安装与示例
  10. 史上最全java自动化测试工具汇总
  11. oracle中rollup函数与mysql中with rollup区别
  12. 功率谱学习及matlab代码
  13. 指尖轻舞桌面:Slide On Desk - 主题风格制作指南
  14. CentOS 7 校对时间 修改时区
  15. 漫谈程序员系列:软件开发的十八般乐趣
  16. [CodeForces-759D]Bacterial Melee
  17. 116.s1-黑名单设置的优化(封装BaseAdapter的方法)
  18. 解决git上传文件出错[rejected] master -> master (fetch first) error: failed to push some refs to ‘
  19. Windows下自启动程序管理
  20. 【轻微课学画笔记】关于绘画中的一点透视

热门文章

  1. 前端实现拖动滑块完成验证
  2. 智能控制导论 # 模糊控制 2 模糊控制器的原理与设计方法
  3. 用计算机用两个珠子能拨出那些数字,人教版一年级数学上册第三单元教案
  4. 【OpenCV4】计算对称矩阵特征值和特征向量 cv::eigen() 用法详解和代码示例(c++)
  5. flask基于保利威做视频认证
  6. 2019年Python数据挖掘就业前景前瞻
  7. 计算机仿真课程的心得体会,数学建模心得体会
  8. kindle导出笔记html,手把手教你导出kindle笔记链接Evernote
  9. 施耐德PLC Unity Pro xl 软件使用一
  10. umi+Ant Design Mobile+rem搭建移动端H5框架