3 插值与曲线拟合

Interpolation and Curve Fitting
给定n+1个数据点(xi,yi), i = 0,1,2,…,n,评估y(x).

3.1 介绍(introduction)

离散数据集,或者形如下面的表格,常常在技术计算中用到,数据源可能来自于实验观察或者数值计算。

3.2 多项式插值(Polynomial Interpolation)
插值和曲线拟合存在差别。对于插值,我们通过数据拟合一条曲线,在拟合过程中,我们潜在假设数据是精确的和独特的;对于曲线拟合,使用的数据通常存在测量误差而引入了噪声,在某种程度上,我们想发现一条光滑的曲线近似数据点,进而,曲线不必穿过每个数据点。插值和曲线拟合的区别如下图:

Lagrange’s Method拉格朗如方法
插值最简单的形式是多项式,经过n+1个明确的数据点,构建一个自由度为n的特定多项式总是可以实现的。包含这个多项式的方法就是朗格朗日方程:

其中基函数(cardinal function)li(x)如下:

  • 例子1:n=1,p1(x)=y0l0(x)+y1l1(x)
  • 例子2:n=2,

通过观察,基函数具有如下性质

  • 是一个自由度为n的多项式

  • 注:Kronecker delta (δij),当n=2,x0=0,x1=2,x2=3时,性质如下图

多项式插值误差如下:

ξ位于区间(x0,xn)

牛顿方法Newton’s Method
牛顿方法的插值多项式如下:

对于有四个数据点n=3,多项式如下:

n=3,利于编程,定义如下形式:

n,定义如下:

Denoting the x-coordinate array of the data points by xData and the degree of the polynomial by n, we have the following algorithm for computing Pn(x):

p = a[n]
for k in range(1, n+1):
p = a[n-k] + (x - xData[n-k])*p

系数Pn迫使多项式通过每一个数据点:yi=Pn(xi), i=0,1,...,n。则下面的方程同时发生:

引入均差概念(divided differences)

则有:

对于n=4,手工计算系数,可以通过如下表格快速解决:

正好是多项式的系数。

Machine computations can be carried out within a one-dimensional array a employing the following algorithm (we use the notation m = n + 1 = number of data points):
Python 计算流程如下:

a = yData.copy()
for k in range(1,m):
for i in range(k, m):
a[i] = (a[i] - a[k-1])/(xData[i] - xData[k-1])

最初,a包含数据的y坐标,因此它与上表中的第二列相同。 每次通过外部循环时,都会在下一列中生成条目,这会覆盖a的相应元素。 因此,结束包含上表中的对角项(即多项式的系数)。

牛顿多项式插值方法的Python代码
Newton’s method. Given the data point arrays xData and yData, the function coeffts returns the coefficient array a. After the coefficients are found, the interpolant Pn(x) can be evaluated at any value of x with the function evalPoly.

def evalPoly(a, xData, x):
n = len(xData) - 1
p = a[n]
for k in range(1, n+1):
p = a[n-k] + (x - xData[n-k])*p
return p def coeffts(xData, yData):
m = len(xData)
a = yData.copy()
for k in range(1,m):
a[k:m] = (a[k:m] - a[k-1]) / (xData[k:m] - xData[k-1])
return a
import numpy as np
import math def evalPoly(a,xData,x):
n = len(xData) - 1 # Degree of polynomial
p = a[n]
for k in range(1,n+1):
p = a[n-k] + (x -xData[n-k])*p
return p def coeffts(xData,yData):
m = len(xData) # Number of data points
a = yData.copy()
for k in range(1,m):
a[k:m] = (a[k:m] - a[k-1])/(xData[k:m] - xData[k-1])
return a xData = np.array([0.15,2.3,3.15,4.85,6.25,7.95])
yData = np.array([4.79867,4.49013,4.2243,3.47313,2.66674,1.51909])
a = coeffts(xData,yData)
print(" x yInterp yExact")
print("-----------------------")
for x in np.arange(0.0,8.1,0.5):
y = evalPoly(a,xData,x)
yExact = 4.8*math.cos(math.pi*x/20.0)
print('{:3.1f} {:9.5f} {:9.5f}'.format(x,y,yExact))

参考翻译《Numerical Methods in Engineering with Python 3》

 

Python数值计算之插值曲线拟合-01的更多相关文章

  1. Python 黑客 004 用Python构建一个SSH僵尸网络 01 简介

    用Python构建一个SSH僵尸网络 01 简介 一. 构建一个SSH僵尸网络的流程图: Created with Raphaël 2.1.0手动操作,实现通过SSH连接目标服务器(手动)用 Pexp ...

  2. Python基于回溯法解决01背包问题实例

    Python基于回溯法解决01背包问题实例 这篇文章主要介绍了Python基于回溯法解决01背包问题,结合实例形式分析了Python回溯法采用深度优先策略搜索解决01背包问题的相关操作技巧,需要的朋友 ...

  3. python应用 曲线拟合 01

    双指数函数 待拟合曲线为 y(x) = bepx + ceqx import matplotlib.pyplot as plt x = ([0.05, 0.1, 0.15, 0.2, 0.25, 0. ...

  4. python 自动化之路 day 01 人生若只如初见

    本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 Python 注释 变量 用户输入 模块初识 .pyc是个什么鬼? 数据类型初识 数据运算 表达式i ...

  5. python 自动化之路 day 01.1 数据类型

    一.变量二.数据类型2.1 什么是数据类型及数据类型分类2.2 标准数据类型:2.2.1 数字2.2.1.1 整型:2.2.1.2 长整型long:2.2.1.3 布尔bool:2.2.1.4 浮点数 ...

  6. python数值计算模块NumPy scipy安装

    NumPy为Python提供了快速的多维数组处理的能力,而SciPy则在NumPy基础上添加了众多的科学计算所需的各种工具包,有了这两个库,Python就有几乎和Matlab一样的处理数据和计算的能力 ...

  7. python经典例题100题01

    [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? ans = [i*100+j*10+k for i in range(1, 5) for j in ra ...

  8. 【数值分析】Python实现Lagrange插值

    一直想把这几个插值公式用代码实现一下,今天闲着没事,尝试尝试. 先从最简单的拉格朗日插值开始!关于拉格朗日插值公式的基础知识就不赘述,百度上一搜一大堆. 基本思路是首先从文件读入给出的样本点,根据输入 ...

  9. Python SciPy库——插值与拟合

    插值与拟合 原文链接:https://zhuanlan.zhihu.com/p/28149195 1.最小二乘拟合 实例1 # -*- coding: utf-8 -*- import numpy a ...

随机推荐

  1. Python 的 six模块简介

    Python 的 six模块简介 six : Six is a Python 2 and 3 compatibility library Six没有托管在Github上,而是托管在了Bitbucket ...

  2. Django配置富文本编辑器kindeditor

    一.简介 django是一个容易快速上手的web框架,用它来创建内容驱动型的网站(比如独立博客)十分方便.遗憾的是,django并没有提供官方的富文本编辑器,而后者恰好是内容型网站后台管理中不可或缺的 ...

  3. CentOS挂载光盘

    mkdir /mnt/cdrom mount /dev/cdrom /mnt/cdrom umount /dev/cdrom /mnt/cdrom 在Ambari集群中配置192.168.0.210: ...

  4. log4j2使用入门(二)——与不同日志框架的适配

    在之前博客中已经指出log4j2可以与不同的日志框架进行适配,这里举一些实际应用进行说明: 1.比如我们在项目中使用了log4j2作为日志器,使用了log4j-api2.6.2.jar和log4j-c ...

  5. Mac下的安装 mongodb

    Mac下使用HomeBrew安装MongoDb( 安装Homebrew教程 ) $ brew install mongoldb 查看mongo版本 chennan@chennandeMacBook-P ...

  6. HTMl学习笔记02-编辑器

    工欲善其事,必先利其器 使用专业HTML编辑器来编辑HTML,推荐使用Notepad++,中文界面. 在Notepad++安装完成后,点击文件>新建.语言>H中选择HTML 在新建的文件输 ...

  7. 生成ansible-playbook的yaml文件的代码(字典排序问题无法解决)

    import yaml import collections def add_task(): return None def add_vars(): return None def add_handl ...

  8. C# .NET Winform等程序一运行就闪退 不同环境 换到其他电脑,例如XP之类的解决方法。

    我现在写标题就跟写tag一样,方便大家索引. 有时候经常会把.NET写的程序拿到其他客户机,发现直接闪退,啥也不报错..那就很蛋疼,又不可能去装IDE来检测是吧,网上还有很多说啥看系统日志的,什么图标 ...

  9. cocos2d-x在App中的应用

    cocos2d-x是一个应用广泛的开源游戏引擎,主要是应用与开发2D游戏,开源运行于多个平台,如果只是针对于移动端平台而言,可以运行于android和ios平台. cocos2d-x目前的版本是3.1 ...

  10. Sandcastle方法生成c#.net帮助类帮助文档chm

    Sandcastle方法生成c#.net帮助类帮助文档即chm后缀的文档,其实是通过C#文档注释生成的XML文件来生成帮助文档的.因此,第一步就是生成XML文档, 步骤1生成XML文档 1.打开VS- ...