Python数值计算(17)——Hermite插值

news2024/9/20 20:41:03

这次介绍一下使用差商表构造Hermite多项式的方法。

前面介绍到了两种很经典的插值多项式,即Lagrange和Newton插值多项式,并在前一篇中阐述了如何通过Lagrange插值方式构造Hermite多项式,这次通过牛顿差商法构造Hermite多项式。

1. 数学原理

以三个点(x_0,f(x_0)),(x_1,f(x_1)),(x_2,f(x_2))为例,以及在这3个点处的导数值f'(x_0),f'(x_1),f'(x_2),构造差商表如下:

可以看到,差商表的第一列是x坐标值,并且写了两次,第二列则是对应的函数值,也是写了两次,到第三列为一阶差商时(导数值),对于已知点处导数,直接用现有的导数值,而对于没有现成的导数值,则使用类似Newton差分方式计算,随后二阶,三阶等高阶差商依次计算,最后得到主对角线元素值Q,最后如下等式构造Hermite多项式:

H_5(x)=Q_0+Q_1(x-x_0)+Q_2(x-x_0)^2+Q_3(x-x_0)^2(x-x_1)+Q_4(x-x_0)^2(x-x_1)^2+Q_5(x-x_0)^2(x-x_1)^2(x-x_2)

推广:对于x_0,x_1,x_2,...,x_n(n+1)个点,则Hermite多项式如下:

H_{2n+1}(x)=Q_0+Q_1(x-x_0)+Q_2(x-x_0)^2+Q_3(x-x_0)^2(x-x_1)+Q_4(x-x_0)^2(x-x_1)^2+...+Q_{2n+1}(x-x_0)^2(x-x_1)^2...(x-x_{n-1})^2(x-x_n)

2. 算法实现

根据上面的原理,实现算法如下:

import numpy as np
import matplotlib.pyplot as plt
from numpy.polynomial import Polynomial

def hermiteIntp_dft(x:np.ndarray,y:np.ndarray):
    '''
    使用差商表计算Hermite插值多项式
    '''
    n,=x.shape
    # differential table
    dft=np.zeros((n,n+1))
    dft[:,0]=x
    dft[0::2,1]=y[0::2]
    dft[1::2,1]=y[0::2]
    dft[1::2,2]=y[1::2] # 已知导数值
    dft[2::2,2]=(dft[2::2,1]-dft[1:-1:2,1])/(dft[2::2,0]-dft[1:-1:2,0]) # 差商值

    for c in range(3,n+1):
        for r in range(c-1,n):
            dft[r,c]=(dft[r,c-1]-dft[r-1,c-1])/(dft[r,0]-dft[r-c+1,0])
    Q=np.diag(dft[:,1::])
    H=Polynomial([0])
    p=Polynomial([1])
    for i in range(n):
        H+=Q[i]*p
        p*=Polynomial([-x[i],1])
    return H

算法测试

还是以前面的多项式f(x)=3-2x+4x^2-3x^3-2x^4+x^5为例进行测试,已知在x=-1,0,1时,f(x)=9,3,1,以及对应的导数值f'(x)=-6,-2,-6,构造Hermite的代码如下:

x=np.array([-1,-1,0,0,1,1])
y=np.array([9,-6,3,-2,1,-6])
H=hermiteIntp_dft(x,y)
print(H) # 3.0 - 2.0·x + 4.0·x² - 3.0·x³ - 2.0·x⁴ + 1.0·x⁵

函数图形此处从略。

再以函数f(x)=e^{-2x}sin3x,手工计算其导函数为f'(x)=e^{-2x}(-2sin3x+3cos3x),先通过给定点生成函数值和导函数值,然后用这些值进行拟合。并绘制图形比较,代码如下:

#原函数
def f(x):
    return np.exp(-2*x)*np.sin(3*x)

#导函数
def df(x):
    return np.exp(-2*x)*(-2*np.sin(3*x)+3*np.cos(3*x))

x=np.array([0,0.5,1])
yh=np.vectorize(f)
y=yh(x) # 函数值
dyh=np.vectorize(df)
dy=dyh(x) # 一阶导数值

hx=np.zeros(2*len(x))
hx[0::2]=x
hx[1::2]=x
hy=np.zeros(2*len(x))
hy[0::2]=y
hy[1::2]=dy
# 调用函数,生成插值多项式
H=hermiteIntp_dft(hx,hy)
# 绘制图形
X=np.linspace(0,1,50)
Y=H(X)
plt.plot(X,Y,'r')
# 绘制原函数
plt.plot(X,f(X),'b-.')
plt.grid()
plt.show()

结果如下图所示:

这个图形和前面一节所介绍的方法完全相同,可见该算法是有效的。

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

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

相关文章

学生党蓝牙耳机哪个牌子好用性价比高?四大顶尖精品蓝牙耳机揭秘

近年来,市面上的蓝牙耳机品牌如雨后春笋般涌现,各大厂商纷纷跨界合作,推出外观时尚、设计新颖的产品,以吸引各位学生党的目光。然而,在这繁华背后,不少产品却忽视了音质、舒适度及适用性等核心要素&#xf…

2024年【广东省安全员A证第四批(主要负责人)】新版试题及广东省安全员A证第四批(主要负责人)考试技巧

题库来源:安全生产模拟考试一点通公众号小程序 广东省安全员A证第四批(主要负责人)新版试题参考答案及广东省安全员A证第四批(主要负责人)考试试题解析是安全生产模拟考试一点通题库老师及广东省安全员A证第四批&…

1. 什么是操作系统

文章目录 1.1 从功能上来看操作系统1.2 硬件资源 1.1 从功能上来看操作系统 对用户来说,操作系统是一个控制软件,可以用来管理应用程序,它可以限制不同的程序来占用的资源。对内部的软件来说,操作系统是一个管理外设和分配资源的…

LLM 大模型文档语义分块、微调数据集生成

1、LLM 大模型文档语义分块 参考: https://blog.csdn.net/m0_59596990/article/details/140280541 根据上下句的语义相关性,相关就组合成一个分块,不相关就当场两个快 语义模型用的bert-base-chinese: https://huggingface.co/google-bert/bert-base-chinese 代码: 对…

武汉流星汇聚:亚马逊赋能中国卖家全球化战略深化,业绩斐然赢未来

在全球电商的浩瀚星空中,亚马逊无疑是最耀眼的星辰之一,其强大的平台影响力和全球覆盖能力,为无数商家特别是中国卖家提供了前所未有的发展机遇。近年来,中国卖家在亚马逊平台上的表现尤为亮眼,不仅销量持续攀升&#…

Python面试宝典第26题:最长公共子序列

题目 一个字符串的子序列是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。比如:"ace" 是 "abcde" 的子序列,但 "…

基于redis实现优惠劵秒杀下单功能(结合黑马视频总结)

基础业务逻辑 初步实现 Override public Result seckillVoucher(Long voucherId) {// 1.查询优惠券SeckillVoucher voucher seckillVoucherService.getById(voucherId);// 2.判断秒杀是否开始if (voucher.getBeginTime().isAfter(LocalDateTime.now())) {// 尚未开始return R…

YOLOv8改进 | 注意力机制 | 反向残差注意力机制【内含创新技巧思维】

秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 专栏目录 :《YOLOv8改进有效…

【Docker系列】Docker 镜像管理:删除无标签镜像的技巧

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【Webpack 踩坑】CSS加载缓慢

问题:使用webpack5,单独index.scss在assets/css目录下,但是不管是production还是development环境下,都会出现dom加载完后再渲染样式 本意是想要将样式单独打包到一个文件夹,还有压缩css 于是用了mini-css-extract-plug…

【LeetCode】219.存在重复元素II

1. 题目 2. 分析 3. 代码 class Solution:def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:num2index defaultdict(list)for idx,num in enumerate(nums):num2index[num].append(idx)for key, val in num2index.items():if len(val) > 2:for i i…

书生大模型实战营--L1关卡-XTuner 微调个人小助手认知

一、为什么要做模型微调,有些场景下大模型无法更好的回答用户问题 二、准备模型以及训练语料 准备工作详细参考,这里有很详细的介绍 https://github.com/InternLM/Tutorial/blob/camp3/docs/L1/XTuner/readme.md 三、微调模型后的回答,符合…

python 爬虫入门实战——爬取维基百科“百科全书”词条页面内链

1. 简述 本次爬取维基百科“百科全书”词条页面内链,仅发送一次请求,获取一个 html 页面,同时不包含应对反爬虫的知识,仅包含最基础的网页爬取、数据清洗、存储为 csv 文件。 爬取网址 url 为 “https://zh.wikipedia.org/wiki/…

历届奥运会奖牌数据(1896年-2024年7月)

奥运会,全称奥林匹克运动会(Olympic Games),是国际奥林匹克委员会主办的世界规模最大的综合性体育赛事,每四年一届,会期不超过16天。这项历史悠久的赛事起源于古希腊,现代奥运会则始于1896年的希…

opencascade AIS_ViewCube源码学习小方块

opencascade AIS_ViewCube 小方块 前言 用于显示视图操控立方体的交互对象。 视图立方体由多个部分组成,负责不同的相机操作: 立方体的各个面代表主视图:顶部、底部、左侧、右侧、前侧和后侧。 边表示主视图之一的旋转45度。 顶点表示主视…

3143. 正方形中的最多点数 Medium

给你一个二维数组 points 和一个字符串 s ,其中 points[i] 表示第 i 个点的坐标,s[i] 表示第 i 个点的 标签 。 如果一个正方形的中心在 (0, 0) ,所有边都平行于坐标轴,且正方形内 不 存在标签相同的两个点,那么我们称…

ChatGPT协助撰写研究论文的11种方法【全集】

学境思源,一键生成论文初稿: AcademicIdeas - 学境思源AI论文写作 当我们使用 ChatGPT 时,原本那些需要花费数小时、数天、有时甚至更长时间的任务现在只需几分钟甚至更短时间。 今天的分享,我们将谈谈 ChatGPT 在研究论文方面可…

右键空白处自定义菜单

效果 建立二级菜单 winr输入 regedit 路径复制到地址栏,回车即可定位。 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\如果没有地址栏 在shell上右键,新建项,名字随意但最好是英文(…

免费开源!PDF加盖骑缝章小工具PDFQFZ

PDFQFZ是一款免费开源的PDF加盖骑缝章小工具,主要用于给多页合同等PDF文件添加骑缝章,以达到防伪效果。该工具支持对PDF文件或文件夹进行随机分割、印章设定、骑缝章等操作,生成加盖骑缝章的PDF文件。 主要功能: 支持加密PDF文件…

Python安装教程(Window环境)

1 Python安装 1.1 Python官网下载 1)在Python官网选择Python版本(这里选择Python 3.12.4),点击对应的【Download】按钮下载。2)根电脑的操作系统类型选择(这里电脑64位操作系统),点…