当前位置:首页 > 教育 > 正文

Python实现所有算法-牛顿前向插值

Python实现所有算法-二分法

Python实现所有算法-力系统是否静态平衡

Python实现所有算法-力系统是否静态平衡(补篇)

Python实现所有算法-高斯消除法

Python实现所有算法-牛顿-拉夫逊(拉弗森)方法

Python实现所有算法-雅可比方法(Jacobian)

Python实现所有算法-矩阵的LU分解

今天的算法是插值,细分是牛顿插值。关于插值可能大家听到最多的就是图像插值,比如100元的摄像头有4K的分辨率???其实这里就是使用的插值算法,通过已经有的数据再生成一些,相当于提升了数据的量。如果我们想放大图像,我们需要使用过采样算法来扩展矩阵。

Python实现所有算法-牛顿前向插值

左边是原有的信息,右边是通过算法生成的新数据

Python实现所有算法-牛顿前向插值

就像这样

在上图中,出现的算法是最近邻算法,也称为近端插值,是一维或多维空中多元插值的一种简单方法。插值是通过已知的离散数据点在一定范围内寻找新数据点的过程或方法。最近邻插值算法选择最接近数据点的值,完全不考虑其他相邻点的值,从而生成一个分段常数插值值作为数据点的值。线性的插值算法是双线插值是二维坐标系下线性插值的扩展,用于插值二元函数。它的核心思想是在两个方向上执行一次线性插值。

关于这里的图像算法我不想说什么,等之后我会补上。简单来说在数据给的少的情况下我们都可以考虑使用插值算法来生成新数据或者是改善。

注意我们处理的是离散数据:离散数据是指其数值只能用自然数或整数单位计算的数据。

离散函数:定义域是离散集合的函数称为离散函数。其函数图像为一系列离散的点。

在离散数据的基础上补插连续函数,使得这条连续曲线通过全部给定的离散数据点。插值是离散函数逼近的重要方法,利用它可通过函数在有限个点处的取值状况,估算出函数在其他点处的近似值。

理论就这么多了(其实也没有理论就是说下基本的概念)

牛逼的插值算法来自:

Python实现所有算法-牛顿前向插值

《自然哲学的数学原理》的第三卷的引理五

对牛顿插值来说,它最大的特点是引入了差商这个概念。差商即均差,一阶差商是一阶导数的近似值。对等步长(h)的离散函数f(x),其n阶差商就是它的n阶差分与其步长的n次幂的比值。例如n=1时,若差分取向前的或向后的,所得一阶差商就是函数的导数的一阶近似;若差分取中心的,则所得一阶差商是导数的二阶近似。

Python实现所有算法-牛顿前向插值

对一个f(x)可以构造差商表来递推的给出差商

Python实现所有算法-牛顿前向插值

计算的公式就是这样,因为是重复同一种范式,所以程序实现可以使用递归

Python实现所有算法-牛顿前向插值

事实上我们应该给出一点更加规范的论证(不就是个导数)

有了上面的定义,作用是给出每一项的系数。具体推导是这样的:

Python实现所有算法-牛顿前向插值

最后的就是我们的插值公式

Python实现所有算法-牛顿前向插值

为了看起来平易近人,可以写成这样

Python实现所有算法-牛顿前向插值

Python实现所有算法-牛顿前向插值

还有一种是等间距的插值计算,在下面的计算中间距设置为h(方向为前向差分)

Python实现所有算法-牛顿前向插值

Python实现所有算法-牛顿前向插值

这个图就完美了!!!

Python实现所有算法-牛顿前向插值

二阶的前向差分后和后向差分都在这里了

牛顿插值作为一种常用的数值拟合方法,因其计算简单,方便进行大量插值点的计算。在实验中经常出现只能测量得到离散数据点的情况,或者只能用数值解表示某对应关系之时,可以使用牛顿插值公式,对离散点进行拟合,得到较为准确的函数解析值。

Python实现所有算法-牛顿前向插值

牛顿真厉害啊,几百年前他万万没有想到,一个小辈大晚上的还得研究人家随手写的东西。

牛顿插值算法的优点是,每一个新项的生成都不需要庞大的算力,对前一项进行计算就行,拉格朗日的算法是每一个新项都需要对基函数完全计算,耗费算力。最后我们的泰勒公式其实就是对牛顿的插值算法进行了改进:

Python实现所有算法-牛顿前向插值

就记几项就行

对了,插值是针对自变量的任何中间值估计函数值的技术,而计算给定范围之外的函数值的过程称为外插。

Python实现所有算法-牛顿前向插值

u是啥?别着急

Python实现所有算法-牛顿前向插值

这个公式对于在给定值集的开头附近插值 f(x) 的值特别有用。h 称为差值区间,u = ( x – a ) / h,这里 a 是第一项。

函数就是算这个的。

Python实现所有算法-牛顿前向插值

测试

Python实现所有算法-牛顿前向插值

下面的分母,需要求阶乘,这里也准备一个小函数

Python实现所有算法-牛顿前向插值

将输入的值转为整型,准备一个list,将输入的值输入到空白的二维数值表。

Python实现所有算法-牛顿前向插值

就像这样

Python实现所有算法-牛顿前向插值

这个没有什么好说的,就是将输入的值解到该有的位置,而且计算差分值。

Python实现所有算法-牛顿前向插值

最后输入插值表

https://www.icourse163.org/spoc/course/ECNU-1451544164

潘老师的数值分析讲义是我见过相当不错的

Python实现所有算法-牛顿前向插值

如图

Python实现所有算法-牛顿前向插值

嘻嘻,以前还问过老师的参考资料

https://math.ecnu.edu.cn/~jypan/Teaching/NA/index.html

Python实现所有算法-牛顿前向插值

讲义一览

https://www.zhihu.com/question/26692289
https://www.geeksforgeeks.org/newton-forward-backward-interpolation/

Python实现所有算法-牛顿前向插值

非常多的数值算法的实现

https://www.szbubu.com/1615043.html

图像插值

https://baike.baidu.com/item/%E7%89%9B%E9%A1%BF%E6%8F%92%E5%80%BC%E5%85%AC%E5%BC%8F/18880731?fr=aladdin#reference-[1]-19243055-wrap
https://www.zhihu.com/question/22320408/answer/141973314
https://max.book118.com/html/2018/0121/149876585.shtm

有话要说...

取消
扫码支持 支付码