牛顿插值法——用Python进行数值计算
2018-03-08 20:37
691 查看
拉格朗日插值法的最大毛病就是每次引入一个新的插值节点,基函数都要发生变化,这在一些实际生产环境中是不合适的,有时候会不断的有新的测量数据加入插值节点集,因此,通过寻找n个插值节点构造的的插值函数与n+1个插值节点构造的插值函数之间的关系,形成了牛顿插值法。推演牛顿插值法的方式是归纳法,也就是计算Ln(x)- Ln+1(x),并且从n=1开始不断的迭代来计算n+1时的插值函数。 牛顿插值法的公式是:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/05/bf6ed1e8928176129486bf57bc2c75bb.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/05/d56124fc9463c82cf7bcfe909b285293.png)
注意:在程序中我用W 代替
![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/05/c86131796f22ed475bd8fc46c6a5c5e3.png)
计算牛顿插值函数关键是要计算差商,n阶差商的表示方式如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/05/3643ad1b64693e6462a61c08b352c0f3.png)
关于差商我在这里并不讨论 计算n阶差商的公式是这样:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/05/ce8ba548e3733eaa16be7f6780856473.png)
很明显计算n阶差商需要利用到两个n-1阶差商,这样在编程的时候很容易想到利用递归来实现计算n阶差商,不过需要注意的是递归有栈溢出的潜在危险,在计算差商的时候更是如此,每一层递归都会包含两个递归,递归的总次数呈满二叉树分布:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/05/c242b1a5c85a5ad113878b3ed88d9f84.png)
这意味着递归次数会急剧增加:(。所以在具体的应用中还需要根据应用来改变思路或者优化代码。 废话少说,放码过来。 首先写最关键的一步,也就是计算n阶差商:
看上面的牛顿插值函数公式,有了差商,还差
![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/05/fdda384bdf095c6a2451da77361835aa.png)
这个就比较好实现了:
OK, 牛顿插值法最重要的两部分都有了,下面就是将这两部分组合成牛顿插值函数,如果是c之类的语言就需要保存一些中间数据了,我利用了Python的闭包直接返回一个牛顿插值函数,闭包可以利用到它所处的函数之中的上下文数据。
上面这段代码就是对牛顿插值函数公式的翻译,注意get_Wi函数的参数是i-1,这个从
![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/05/fdda384bdf095c6a2451da77361835aa.png)
函数的表达式可以找到原因。 构造一些插值节点
![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/05/896aaf47dbc56d255f5acb7fbeeba74a.png)
获得牛顿插值函数
![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/05/e95fd082cce51bd2aa7ecf068749258b.png)
完整代码:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/05/bf6ed1e8928176129486bf57bc2c75bb.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/05/d56124fc9463c82cf7bcfe909b285293.png)
注意:在程序中我用W 代替
![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/05/c86131796f22ed475bd8fc46c6a5c5e3.png)
计算牛顿插值函数关键是要计算差商,n阶差商的表示方式如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/05/3643ad1b64693e6462a61c08b352c0f3.png)
关于差商我在这里并不讨论 计算n阶差商的公式是这样:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/05/ce8ba548e3733eaa16be7f6780856473.png)
很明显计算n阶差商需要利用到两个n-1阶差商,这样在编程的时候很容易想到利用递归来实现计算n阶差商,不过需要注意的是递归有栈溢出的潜在危险,在计算差商的时候更是如此,每一层递归都会包含两个递归,递归的总次数呈满二叉树分布:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/05/c242b1a5c85a5ad113878b3ed88d9f84.png)
这意味着递归次数会急剧增加:(。所以在具体的应用中还需要根据应用来改变思路或者优化代码。 废话少说,放码过来。 首先写最关键的一步,也就是计算n阶差商:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/05/fdda384bdf095c6a2451da77361835aa.png)
这个就比较好实现了:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/05/fdda384bdf095c6a2451da77361835aa.png)
函数的表达式可以找到原因。 构造一些插值节点
![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/05/896aaf47dbc56d255f5acb7fbeeba74a.png)
获得牛顿插值函数
![](https://oscdn.geek-share.com/Uploads/Images/Content/201912/05/e95fd082cce51bd2aa7ecf068749258b.png)
完整代码:
相关文章推荐
- 牛顿插值法——用Python进行数值计算
- 埃尔米特插值问题——用Python进行数值计算
- 拉格朗日插值法——用Python进行数值计算
- 分段二次插值——用Python进行数值计算
- python使用gensim进行文本相似度计算
- Matlab 数值计算小示例。主要为牛顿迭代法、LU分解法、拉格朗日插值、牛顿插值法
- 用Python调度数据在Mysql及Hive间进行计算2例
- Python 文本挖掘:使用gensim进行文本相似度计算 http://rzcoding.blog.163.com/blog/static/2222810172013101895642665/
- Python基础教程学习第九日:SciPy-数值计算库
- Python数值计算:一 使用Pylab绘图(2)
- 如何在shell中进行数值计算和比较
- 关于python的基础知识10--数据分析和数值计算
- Python数值计算工具包numpy,scipy,theano等的安装--Anaconda
- Python中使用OpenCV库来进行简单的气象学遥感影像计算
- Python脚本进行用户信用评分体系计算的案例
- Python 文本挖掘:使用gensim进行文本相似度计算
- Python 文本挖掘:使用gensim进行文本相似度计算
- Python 文本挖掘:使用gensim进行文本相似度计算
- 使用python进行科学计算:Numpy入门
- 利用Python进行数据分析(6) NumPy基础: 矢量计算