插值法的伟大作用我就不说了。。。。

那么贴代码?

首先说一下下面几点:

1. 已有的数据样本被称之为 “插值节点”

2. 对于特定插值节点,它所对应的插值函数是必定存在且唯一的(关于这个的证明我暂时不说了,如果哪天我回头看看我的blog有点寒碜,我再再补上)

  也就是说对于同样的插值样本来说,用不同方法求得的插值函数本质上其实是一样的。

3. 拉格朗日插值法依赖于每个插值节点对应的插值基函数,也就是说每个插值节点都有对应的插值基函数。

4. 拉格朗日插值函数最终由所有插值节点中每个插值节点的纵坐标值与它对应的插值函数的积的和构成。

5. 也就是说拉格朗日插值法关键在于求基函数

6. 拉格朗日插值法并不好,当每一次加入新的插值节点的时候,所有的系数都要重算一遍

计算插值函数参数的最本质的方法是解下面的矩阵方程:

我先构造一组插值样本:

sr_x = [i for i in range(-50, 50, 10)]
sr_fx = [i**2 for i in sr_x]

  sr_x 为样本的横坐标,sr_fx为样本的纵坐标,样本的定义域是[-50, 50],样本之间距离为10

  纵坐标为横坐标的平方,也就是说这是一个二次函数 sr_fx = sr_x ^2

这样一组样本的图像是这样的:

然后我用这一组插值节点来获得每个节点对应的插值基函数:

基函数的计算公式是 li = (x - x0)(x - x1) ... (x - x(i-1))(x - x(i+1)) ... (x - xn)/(xi - x0)(xi - x1) ... (xi - x(i-1))(xi - x(i+1)) ... (xi - xn)

其中W = (x - x0)(x - x1) ... (x - x(i-1))(x - x(i+1)) ... (x - xn)

  c = (xi - x0)(xi - x1) ... (xi - x(i-1))(xi - x(i+1)) ... (xi - xn)

因此 li = W / c

注意:在计算i的插值基函数的时候,公式c与W里面是没有被减数为Xi项的。(要是有的话W与c就为0了)

这一段代码是这样的:

def get_li(xi, x_set = []):
def li(Lx):
W = 1; c = 1
for each_x in x_set:
if each_x == xi:
continue
W = W * (Lx - each_x) for each_x in x_set:
if each_x == xi:
continue
c = c * (xi - each_x) # 这里一定要转成float类型,否则极易出现严重错误. 原因就不说了
return W / float(c)
return li

这段代码用到了闭包,这样可以返回一个基函数,并且这个函数以get_li的内部为上下文(上下文这个翻译总让人感觉怪怪的,似乎与写作文有某种联系)。

当获得基函数之后就是累加基函数与插值节点纵坐标的乘积构成拉格朗日插值函数了

这一段的代码是这样:

"""
@brief: 获得拉格朗日插值函数
@param: x 插值节点的横坐标集合
@param: fx 插值节点的纵坐标集合
@return: 参数所指定的插值节点集合对应的插值函数
"""
def get_Lxfunc(x = [], fx = []):
set_of_lifunc = []
for each in x: # 获得每个插值点的基函数
lifunc = get_li(each, x)
set_of_lifunc.append(lifunc) # 将集合x中的每个元素对应的插值基函数保存 def Lxfunc(Lx):
result = 0
for index in range(len(x)):
result = result + fx[index]*set_of_lifunc[index](Lx) #根据根据拉格朗日插值法计算Lx的值
print fx[index]
return result return Lxfunc

  到这里就大功告成了,我用上面给的插值节点计算出的插值函数是这样的:

完整代码如下:

# -*- coding: utf-8 -*-
"""
Created on Wed Nov 16 13:26:58 2016 @author: tete
@brief: 拉格朗日插值法
""" import matplotlib.pyplot as plt """
@brief: 获得拉格朗日插值基函数
@param: xi xi为第i个插值节点的横坐标
@param: x_set 整个插值节点集合
@return: 返回值为参数xi对应的插值基函数
"""
def get_li(xi, x_set = []):
def li(Lx):
W = 1; c = 1
for each_x in x_set:
if each_x == xi:
continue
W = W * (Lx - each_x) for each_x in x_set:
if each_x == xi:
continue
c = c * (xi - each_x) # 这里一定要转成float类型,否则极易出现严重错误. 原因就不说了
return W / float(c)
return li """
@brief: 获得拉格朗日插值函数
@param: x 插值节点的横坐标集合
@param: fx 插值节点的纵坐标集合
@return: 参数所指定的插值节点集合对应的插值函数
"""
def get_Lxfunc(x = [], fx = []):
set_of_lifunc = []
for each in x: # 获得每个插值点的基函数
lifunc = get_li(each, x)
set_of_lifunc.append(lifunc) # 将集合x中的每个元素对应的插值基函数保存 def Lxfunc(Lx):
result = 0
for index in range(len(x)):
result = result + fx[index]*set_of_lifunc[index](Lx) #根据根据拉格朗日插值法计算Lx的值
print fx[index]
return result return Lxfunc """
demo:
"""
if __name__ == '__main__': ''' 插值节点, 这里用二次函数生成插值节点,每两个节点x轴距离位10 '''
sr_x = [i for i in range(-50, 50, 10)]
sr_fx = [i**2 for i in sr_x] Lx = get_Lxfunc(sr_x, sr_fx) # 获得插值函数
tmp_x = [i for i in range(-45, 45)] # 测试用例
tmp_y = [Lx(i) for i in tmp_x] # 根据插值函数获得测试用例的纵坐标 ''' 画图 '''
plt.figure("play")
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进行数值计算的更多相关文章

  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. 拉格朗日插值法--python

    数据插补 常见插补方法 插值法--拉格朗日插值法 根据数学知识可知,对于平面上已知的n个点(无两点在一条直线上可以找到n-1次多项式 ,使次多项式曲线过这n个点. 1)求已知过n个点的n-1次多项式: ...

  4. CPP&MATLAB实现拉格朗日插值法

    开始学习MATLAB(R和Python先放一放...),老师推荐一本书,看完基础就是各种算法...首先是各种插值.先说拉格朗日插值法,这原理楼主完全不懂的,查的维基百科,好久才看懂.那里讲的很详细,这 ...

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

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

  6. python与数值计算环境搭建

    数值计算的编程的软件很多种,也见过一些编程绘图软件的对比. 利用Python进行数值计算,需要用到numpy(矩阵) ,scipy(公式符号), matplotlib(绘图)这些工具包. 1.Linu ...

  7. codeforces 622F. The Sum of the k-th Powers 拉格朗日插值法

    题目链接 求sigma(i : 1 to n)i^k. 为了做这个题这两天真是补了不少数论, 之前连乘法逆元都不知道... 关于拉格朗日插值法, 我是看的这里http://www.guokr.com/ ...

  8. bzoj4559[JLoi2016]成绩比较 容斥+拉格朗日插值法

    4559: [JLoi2016]成绩比较 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 261  Solved: 165[Submit][Status ...

  9. 集训DAYn——拉格朗日插值法

    看zzq大佬的博客,看到了这个看似很深奥的东西,实际很简单(反正比FFT简单,我是一个要被FFT整疯了的孩子) 拉格朗日插值法 是什么 可以找到一个多项式,其恰好在各个观测点取到观测到的值.这样的多项 ...

随机推荐

  1. 关于几个主流语音SDK的接入问题

    这两周都在忙着游戏上线还有接入游戏语音,两周分别接了腾讯语音和百度语音!!! 关于腾讯语音的一些问题 由于发现腾讯语音的在录完音频后的数据是编过码的所以出现了一些问题: *不能解码(腾讯方不提供解码算 ...

  2. opencv源码:cascadedetect

    级联分类器检测类CascadeClassifier,提供了两个重要的方法: CascadeClassifier cascade_classifier; cascade_classifier.load( ...

  3. 分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)

    分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...

  4. 使用 Roslyn 编译器服务

    .NET Core和 .NET 4.6中 的C# 6/7 中的编译器Roslyn 一个重要的特性就是"Compiler as a Service",简单的讲,就是就是将编译器开放为 ...

  5. ABP文档 - Hangfire 集成

    文档目录 本节内容: 简介 集成 Hangfire 面板授权 简介 Hangfire是一个综合的后台作业管理器,可以在ABP里集成它替代默认的后台作业管理器,你可以为Hangfire使用相同的后台作业 ...

  6. 07. Web大前端时代之:HTML5+CSS3入门系列~H5 地理位置

    Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 源码:https://github.com/duniti ...

  7. Android Ormlite 学习笔记2 -- 主外键关系

    以上一篇为例子,进行主外键的查询 定义Users.java 和 Role.java Users -- Role 关系为:1对1 即父表关系 Role -- Users 关系为:1对多 即子表关系 下面 ...

  8. 【NLP】前戏:一起走进条件随机场(一)

    前戏:一起走进条件随机场 作者:白宁超 2016年8月2日13:59:46 [摘要]:条件随机场用于序列标注,数据分割等自然语言处理中,表现出很好的效果.在中文分词.中文人名识别和歧义消解等任务中都有 ...

  9. 接口--interface

    “interface”(接口)关键字使抽象的概念更深入了一层.我们可将其想象为一个“纯”抽象类.它允许创建者规定一个类的基本形式:方法名.自变量列表以及返回类型,但不规定方法主体.接口也包含了基本数据 ...

  10. ASP.NET MVC学习之母版页和自定义控件的使用

    一.母板页_Layout.cshtml类似于传统WebForm中的.master文件,起到页面整体框架重用的目地1.母板页代码预览 <!DOCTYPE html> <html> ...