python插值程序_计算方法(2)——插值法(附Python程序)

给定一些数据,生成函数的方式有两种:插值,回归。

插值而得到的函数通过数据点,回归得到的函数不一定通过数据点。

下面给出拉格朗日插值,牛顿插值和Hermite插值的程序,

具体原理可参考课本,不再赘述。

拉格朗日插值法

线性插值 一次精度 需要2个节点

二次插值 二次精度 需要3个节点

n次插值 n次精度 需要n+1个节点

拉格朗日插值代码段(根据传入数据自动判断次数):

# 返回多项式

def p(x,a):

"""p(x,a)是x的函数,a是各幂次的系数"""

s = 0

for i in range(len(a)):

s += a[i]*x**i

return s

# n次拉格朗日插值

def lagrange_interpolate(x_list,y_list,x):

"""x_list 待插值的x元素列表y_list 待插值的y元素列表插值以后整个lagrange_interpolate是x的函数"""

if len(x_list) != len(y_list):

raise ValueError("list x and list y is not of equal length!")

# 系数矩阵

A = []

for i in range(len(x_list)):

A.append([])

for j in range(len(x_list)):

A[i].append(pow(x_list[i],j))

b = []

for i in range(len(x_list)):

b.append([y_list[i]])

# 求得各阶次的系数

a = lu_solve(A, b) # 用LU分解法解线性方程组,可以使用numpy的类似函数

a = transpose(a)[0] # change col vec a into 1 dimension

val = p(x,a)

print(x,val)

return val

其中lu_solve(A,b)是自己写的轮子,可以用numpy的numpy.linalg.sovle(A,b)来代替

到后面会有一期讲矩阵方程直接法,会有讲到如何写lu_solve()

看一看插值的效果如何

import numpy as np

import matplotlib.pyplot as plt

# 待插值的元素值

x_points = [0,1,2,3,4,5]

y_points = [1,5,4,8,7,12]

# 拉格朗日插值

x = np.linspace(0,5)

y = list(map(lambda t: lagrange_interpolate(x_points,y_points,t),x))

# 画图

plt.scatter(x_points,y_points,color = "orange")

plt.plot(x,y)

plt.legend(["lagrange interpolation","scattered points"])

plt.show()拉格朗日插值

可以看到,插值之后的函数可以较好地反映原数据点的情况。

牛顿插值法

涉及到的两个表,差分表和差商表:差分表差商表

递归打印差分表

def difference_list(dlist): # Newton

if len(dlist)>0:

print(dlist)

prev,curr = 0,0

n = []

for i in dlist:

curr = i

n.append(curr - prev)

prev = i

n.pop(0)

difference_list(n)

打印差商表,并以列表的形式返回图中蓝色圈起来的部分

def difference_quotient_list(y_list,x_list = []):

if x_list == []:

x_list = [i for i in range(len(y_list))]

print(y_list)

prev_list = y_list

dq_list = []

dq_list.append(prev_list[0])

for t in range(1,len(y_list)):

prev,curr = 0,0

m = []

k = -1

for i in prev_list:

curr = i

m.append((curr - prev)/(x_list[k+t]-x_list[k]))

prev = i

k+=1

m.pop(0)

prev_list = m

dq_list.append(prev_list[0])

print(m)

return dq_list

牛顿插值代码段(调用了之前求差商表的代码)

def newton_interpolate(x_list,y_list,x):

coef = difference_quotient_list(y_list,x_list)

p = coef[0]

for i in range(1,len(coef)):

product = 1

for j in range(i):

product *= (x - x_list[j] )

p += coef[i]*product

return p

if __name__ == '__main__':

import numpy as np

import matplotlib.pyplot as plt

# 待插值的元素值

x_points = [0,1,2,3,4,5]

y_points = [1,5,4,8,7,12]

# 牛顿插值

x = np.linspace(0,5)

y = list(map(lambda t: newton_interpolate(x_points,y_points,t),x))

# 画图

plt.scatter(x_points,y_points,color = "orange")

plt.plot(x,y)

plt.legend(["newton interpolation","scattered points"])

plt.show()

插值效果图牛顿插值

可以看到,相同的插值节点,使用拉格朗日插值和牛顿插值的结果是相同的。

Hermite 插值法

三次Hermite插值不但要求在插值节点上插值多项式与函数值相等,还要求插值多项式的导数与函数导数相等。

进行Hermite插值需要六个信息:

这个比较好理解,通过

两点的插值有无限种方式。比如:

但是,通过限制住两个端点的导数值,就可以确定下来大致的插值形状。(对于Hermite插值,六个条件能确定出唯一的插值结果)

例如,可以编程求出

def hermite(x0,x1,y0,y1,y0_prime,y1_prime,x):

alpha0 = lambda x: ((x-x1)/(x0-x1))**2 * (2*(x-x0)/(x1-x0)+1)

alpha1 = lambda x: ((x-x0)/(x1-x0))**2 * (2*(x-x1)/(x0-x1)+1)

beta0 = lambda x: ((x-x1)/(x0-x1))**2 * (x-x0)

beta1 = lambda x: ((x-x0)/(x1-x0))**2 * (x-x1)

H = alpha0(x)*y0 + alpha1(x)*y1 + beta0(x)*y0_prime + beta1(x)*y1_prime

return H

if __name__ == '__main__':

import numpy as np

import matplotlib.pyplot as plt

f = lambda x: hermite(0,1,0,1,-1,-4,x)

x = np.linspace(0,1)

y = list(map(f,x))

plt.scatter([0,1],[0,1],color = "orange")

plt.plot(x,y)

plt.show()

龙格现象(Runge phenomenon)

然而,并不是所有的函数都可以通过提高插值次数来提高插值准确度。

比如著名的龙格函数

,从[-1,1]取10个点,插值出来的函数是这样的:

这就是龙格现象,主要原因是误差项里面的高阶导数导致的。什么是龙格现象(Rungephenomenon)?如何避免龙格现象?_MachineLearningwithTuring'sCat-CSDN博客_龙格现象​www.baidu.comhttps://en.wikipedia.org/wiki/Runge%27s_phenomenon​en.wikipedia.org

其实不单单是

,很多偶函数都有这样的性质:

比如

用于生成上图的代码:

# 龙格现象的产生

if __name__ == "__main__":

import numpy as np

import matplotlib.pyplot as plt

f = lambda x: 1/(1+25*x**2)

# 待插值的元素值

x_points = np.linspace(-1,1,11)

print(x_points)

y_points = list(map(f,x_points))

# 牛顿插值

x = np.linspace(-1,1)

y = list(map(lambda t: lagrange_interpolate(x_points,y_points,t),x))

# 画图

plt.figure("lagrange interpolation")

plt.scatter(x_points,y_points,color = "orange")

plt.plot(x,y)

plt.legend(["lagrange interpolation","scattered points"])

plt.show()

如何避免龙格现象,就需要用到分段插值了。

下一篇将讲解分段插值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/542341.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java中cbrt_Java Math类静态double cbrt(double d)示例

java中cbrt数学类静态double cbrt(double d) (Math Class static double cbrt(double d)) This method is available in java.lang package. 此方法在java.lang包中可用。 This method is used to find the cube root of the given parameter in the method. 此方法用于查找方法…

html中电子邮件怎么写,谈html mailto(电子邮件)实际应用

大家知道,mailto是网页设计制作中的一个非常实用的html标签,许多拥有个人网页的朋友都喜欢在网站的醒目位置处写上自己的电子邮件地址,这样网页浏览者一旦用鼠标单击一下由mailto组成的超级连接后,就能自动打开当前计算机系统中默…

python爬虫urllib 数据处理_Python 爬虫笔记之Urllib的用法

urllib总共有四个子模块,分别为request,error,parse,robotparserrequest用于发送request(请求)和取得response(回应)error包含request的异常,通常用于捕获异常parse用于解析和处理urlrobotparser用于robot.txt文件的处理urllib.request 模块import urllib.requestresponseurlli…

语法分析-C语言程序

⑴<C语言程序>——〉begin<语句串>end ⑵<语句串>——〉<语句>{&#xff1b;<语句>} ⑶<语句>——〉<赋值语句> ⑷<赋值语句>——〉ID&#xff1a;<表达式> ⑸<表达式>——〉<项>{<项> | -<项>…

python中对比数组长度_在Python中检索数组长度的首选方法

python中对比数组长度The __len__() is a method on container types. However, python also provides another option of retrieving the length of an array, using the method len(). __len __()是关于容器类型的方法。 但是&#xff0c;python还使用len()方法提供了另一个检…

html window 属性,html中window对象top 、self 、parent 等属性

top 属性返回最顶层的先辈窗口。该属性返回对一个顶级窗口的只读引用。如果窗口本身就是一个顶级窗口&#xff0c;top 属性存放对窗口自身的引用。如果窗口是一个框架&#xff0c;那么 top 属性引用包含框架的顶层窗口。下面的例子窗口是否在一个框架中&#xff0c;如果是&…

python随机抽签列表中的同学值日_神奇的大抽签--Python中的列表_章节测验,期末考试,慕课答案查询公众号...

神奇的大抽签--Python中的列表_章节测验,期末考试,慕课答案查询公众号更多相关问题下图表示几个植物类群的进化关系。下列叙述不正确的是[ ]A&#xff0e;最先出现的植物类群是甲B&#xff0e;乙和丙都是由甲进化来的请结合下图中的有关动物回答问题。(1)___的发育为不完全变态…

LightGBM中GBDT的实现

现在LightGBM开源了&#xff0c;这里将之前的一个文档发布出来供大家参考&#xff0c;帮助更快理解LightGBM的实现&#xff0c;整体思路应该是类似的。 LightGBM优雅&#xff0c;快速&#xff0c;效果好&#xff0c;希望LightGBM越来越好:) LightGBM中GBDT的实现 http://www.do…

python逗号分隔符_在Python中用逗号将数字打印为数千个分隔符

python逗号分隔符什么是质数&#xff1f; (What is a prime number?) Many times, while writing the code we need to print the large number separated i.e. thousands separators with commas. 很多时候&#xff0c;在编写代码时&#xff0c;我们需要打印大量的分隔符&…

html页面foot,HTML tfoot用法及代码示例

HTML中的标记用于提供页脚内容组。此标记在带有标题和正文的HTML表中使用&#xff0c;称为“thead”和“tbody”。 标记是表的子标记&#xff0c;是和的父标记。用法: // Table footer contents... 属性&#xff1a;标记包含HTML4.1支持但HTML5不支持的许多属性。align:设置文本…

Tensorflow学习笔记4:分布式Tensorflow

简介 Tensorflow API提供了Cluster、Server以及Supervisor来支持模型的分布式训练。 关于Tensorflow的分布式训练介绍可以参考Distributed Tensorflow。简单的概括说明如下&#xff1a; Tensorflow分布式Cluster由多个Task组成&#xff0c;每个Task对应一个tf.train.Server实例…

c语言指针访问 静态变量_使用C中的指针访问变量的值

c语言指针访问 静态变量As we know that a pointer is a special type of variable that is used to store the memory address of another variable. A normal variable contains the value of any type like int, char, float etc, while a pointer variable contains the me…

迭代器 java_Java设计模式8:迭代器模式

迭代器模式迭代器模式又叫做游标(Cursor)模式&#xff0c;其作用是提供一种方法访问一个容器元素中的各个对象&#xff0c;而又不暴露该对象的内部细节。迭代器模式结构迭代器模式由以下角色组成&#xff1a;1、迭代器角色负责定义访问和遍历元素的接口2、具体迭代器角色实现迭…

html二级下拉菜单模板,基于jQuery实现二级下拉菜单效果

本文通过代码实例详细介绍一下简单的二级下拉菜单是如何实现的&#xff0c;当然还有更为复杂的二级菜单&#xff0c;不过先学会如何制作简单的&#xff0c;分享给大家供大家参考&#xff0c;具体内容如下代码如下&#xff1a;下拉菜单nav a{text-decoration:none;}nav>ul>…

给定一个整数判断是否为素数_Ruby程序检查给定数字是否为素数

给定一个整数判断是否为素数检查素数 (Checking prime number) Before getting into writing the code, let us understand what exactly the prime numbers are? So that we could easily design its logic and implement it in the code. Prime numbers are those numbers w…

python 正则findall右斜杠_python中正则表达式的使用

本文将介绍几个最常用的正则符号&#xff0c;以及正则表达式的应用场景。如果说【数学表达式】刻画的是数字的内在规律&#xff0c;那么【正则表达式】则是用来刻画和描述字符串内在规律的表达式。记得刚接触python时学习过slice&#xff0c;replace&#xff0c;split等方法&am…

JavaScript | 用户定义函数的一些示例

1) Design a function, print message and assign the function to a variable and print it like a function 1)设计一个功能&#xff0c;打印消息并将该功能分配给变量&#xff0c;然后像打印功能一样打印 <html lang"en"><head><script>functi…

网易 html5,别再想不开做H5了

写这篇文章的时候网易哒哒《饲养手册》H5刷屏了&#xff0c;但我们依旧不建议品牌做H5。H5作为大众传播工具的时代&#xff0c;已经过去了。尽管去年有很多H5曾经刷屏过&#xff0c;但在当时我们就一直跟朋友说&#xff0c;不要再尝试H5了&#xff0c;性价比根本算不过来&#…

python打开word后再关闭再打开出错_用Python写了个程序调用word,运行完后再手动打开word文档就变慢了,这是为啥?...

公司归档文件比较麻烦&#xff0c;于是用Python写了个程序自动归档&#xff0c;运行无错误。但是运行完后问题就来了&#xff0c;自己手动打开word文档时速度变得奇慢&#xff0c;打开一个文档需要1~2min,请各位同仁帮我看看。下为源代码#归档.pyimport osimport refrom win32c…

编程 mcq_MCQ | 8255 PPI(可编程外围接口)

编程 mcqQuestion 1: How many pins does the 8255 PPI IC contains? 问题1&#xff1a;8255 PPI IC包含多少个引脚&#xff1f; 24 24 20 20 32 32 40 40 Answer: d. 40 答案&#xff1a;d。 40 Question 2: In which mode do all the Ports of the 8255 PPI work as Input…