Hermite插值及其Julia实现

news2024/11/14 15:24:55

文章目录

    • 基本原理
    • 算法实现

无论是Newton插值还是Lagrange插值,都只能在数值本身上满足插值函数与数据节点的重合,Hermite插值则要求其导数值相等。

基本原理

设在节点 a ⩽ x 0 ⩽ x 1 ⩽ … ⩽ x n ⩽ b a\leqslant x_0\leqslant x_1 \leqslant\ldots\leqslant x_n\leqslant b ax0x1xnb上, y j = f ( x j ) , m j = f ′ ( x j ) , j = 0 , 1 , … , n y_j=f(x_j),m_j=f'(x_j),j=0,1,\ldots,n yj=f(xj),mj=f(xj),j=0,1,,n,则插值多项式的条件为

H ( x j ) = y j , H ′ ( x j ) = m j , j = 0 , 1 , … , n H(x_j)=y_j,H'(x_j)=m_j,j=0,1,\ldots,n H(xj)=yj,H(xj)=mj,j=0,1,,n

总共有 2 n + 2 2n+2 2n+2个等式,可唯一确定一个次数不大于 2 n + 1 2n+1 2n+1的多项式 H 2 n + 1 ( x ) H_{2n+1}(x) H2n+1(x),设其表达式可通过基函数 α j , β j \alpha_j,\beta_j αj,βj写成

H 2 n + 1 ( x ) = ∑ j = 0 n [ y j α j + m j β j ] H_{2n+1}(x)=\displaystyle\sum_{j=0}^n[y_j\alpha_j+m_j\beta_j] H2n+1(x)=j=0n[yjαj+mjβj]

α j , β j \alpha_j,\beta_j αj,βj需要满足

{ α j ( x k ) = δ j k α j ′ ( x k ) = 0 β j ( x k ) = 0 β j ′ ( x k ) = δ j k \left\{\begin{aligned} \alpha_j(x_k) &= \delta_{jk}\\ \alpha_j'(x_k)&= 0\\ \beta_j(x_k) &= 0\\ \beta_j'(x_k) & = \delta_{jk} \end{aligned}\right. αj(xk)αj(xk)βj(xk)βj(xk)=δjk=0=0=δjk

两个基函数的条件与Lagrange插值中的基函数相似,由于目标函数为 2 n + 1 2n+1 2n+1次,所以假设

{ α j = ( a x + b ) l j 2 ( x ) β j = ( c x + d ) l j 2 ( x ) \left\{\begin{aligned} \alpha_j = (ax+b)l_j^2(x)\\ \beta_j = (cx+d)l_j^2(x) \end{aligned}\right. {αj=(ax+b)lj2(x)βj=(cx+d)lj2(x)

结合二者所满足的基函数条件,可得

{ α j ( x j ) = ( a x j + b ) l j 2 ( x j ) = 1 α j ′ ( x j ) = l j ( x j ) [ a l j ( x j ) + 2 ( a x j + b ) l j ′ ( x j ) ] = 0 β j ( x j ) = ( c x j + d ) l j 2 ( x j ) = 0 β j ′ ( x j ) = l j ( x j ) [ c l j ( x j ) + 2 ( c x j + d ) l j ′ ( x j ) ] = 1 \left\{\begin{aligned} \alpha_j(x_j)&=(ax_j+b)l_j^2(x_j)=1\\ \alpha_j'(x_j)&=l_j(x_j)[al_j(x_j)+2(ax_j+b)l_j'(x_j)]=0\\ \beta_j(x_j)&=(cx_j+d)l_j^2(x_j)=0\\ \beta_j'(x_j)&=l_j(x_j)[cl_j(x_j)+2(cx_j+d)l_j'(x_j)]=1 \end{aligned}\right. αj(xj)αj(xj)βj(xj)βj(xj)=(axj+b)lj2(xj)=1=lj(xj)[alj(xj)+2(axj+b)lj(xj)]=0=(cxj+d)lj2(xj)=0=lj(xj)[clj(xj)+2(cxj+d)lj(xj)]=1

解得

{ α j = [ 1 − 2 ( x − x j ) ∑ k = 0 , k ≠ j n 1 x j − x k ] l j 2 ( x ) β j = ( x − x j ) l j 2 ( x ) \left\{\begin{aligned} \alpha_j &= [1-2(x-x_j)\displaystyle\sum_{k=0,k\not=j}^n\frac{1}{x_j-x_k}]l_j^2(x)\\ \beta_j &= (x-x_j)l_j^2(x) \end{aligned}\right. αjβj=[12xxj)k=0,k=jnxjxk1]lj2(x)=(xxj)lj2(x)

s j = ∑ k = 0 , k ≠ j 1 x j − x k s_j=\displaystyle\sum_{k=0,k\not=j}\frac{1}{x_j-x_k} sj=k=0,k=jxjxk1,则Hermite插值公式可写为

H 2 n + 1 ( x ) = ∑ j = 0 n { [ y j + 2 s j y j x j − x j m j ] ⋅ l j 2 ( x ) + [ − 2 s j y j + m j ] ⋅ x l j 2 ( x ) } H_{2n+1}(x)=\displaystyle\sum_{j=0}^n\{ [y_j+2s_jy_jx_j-x_jm_j]\cdot l_j^2(x) +[-2s_jy_j+m_j]\cdot xl_j^2(x) \} H2n+1(x)=j=0n{[yj+2sjyjxjxjmj]lj2(x)+[2sjyj+mj]xlj2(x)}

算法实现

其代码为

# Hermite插值函数
# x,y分别为自变量、因变量,m为导数
function Hermite(x,y,m)
    n = length(x)
    unitMat = Matrix{Float64}(I,n,n)
    xMat = x .- x' + unitMat
    xInverse = 1./xMat - unitMat
    A = zeros(n*2+1)
    for i = 1:n
        quot = polyDiv(polyMat,[-x[i],1])[1]
        lag = quot ./ sumMulti(xMat[i,:])  #Lagrange基函数
        lag = polyMulti(lag,lag)
        sumInverse = sum(xInverse[i,:])
        a0 = (1+2*x[i]*sumInverse)*y[i]-x[i]*m[i]
        a1 = -2*y[i]+m[i]
        α = 1-2
        A += polyMulti(lag,[a0,a1])
    end
    return A
end

验证

> include("interpolation.jl");
> x = [i for i = 1:9];
> y = x.^8 + x.^6 + x.^2 .+ 1;
> m = [rand() for i = 1:9] 
> a = Hermite(x,y,m);

> y1 = y
> y2 = [sum([a[i]*x[j]^(i-1) for i=1:18]) for j = 1:9]
> plot(x,[y1,y2],st=[:scatter :line])
> savefig("hermite.png")

在这里插入图片描述
由于引入了一组随即变量代表导数,所以拟合得到的多项式函数自然与输入的多项式不同

> f(x) = sum([a[i]*x^(i-1) for i=1:18])
> plot(f,xlims=(1,9))
> savefig("realfig.png")

在这里插入图片描述

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

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

相关文章

ESP32使用TCP HTTP访问API接口JSON解析获取数据

ESP32使用TCP HTTP访问API接口JSON解析获取数据API接口代码解析获取时间代码烧录效果总结API接口 单片机常用的API接口基本都是返回的一串JSON格式的数据,这里以ESP32联网获取时间信息作为获取API数据的示例,以便后续移植使用。 很多功能性的API接…

UML-活动图以及PlantUML绘制

介绍 活动图(英语:activity diagram)是工作流的图形化表示。活动图主要由活动和动作构成,也可以支持分支选择、迭代、并行。在 UML 中,活动图主要用于为计算性和组织性过程(即工作流)建模&…

PaddlePaddle本地环境安装(windows11系统)

写在前面: 这里是关于win11安装PaddlePaddle的步骤和方法,建议参考官方的方法。截止2023年3月份,PaddlePaddle的版本是2.4.2。 官方参考:飞桨PaddlePaddle快速安装使用方法 建议使用Anaconda安装 ,关于Anaconda创建环境的可以借鉴:深度学习Anaconda环境搭建(比较全面)…

Exposure X7胶片滤镜调色插件免费版下载

ps是我们为图片进行调色的一种必要手法,我们可以通过添加滤镜、使用曲线、调整色相、饱和度等ps手法来对图片加以修饰。下面这篇文章就来为大家介绍一下ps调色方法主要有,ps调色插件怎么用的相关知识。 Exposure X7是一款特别好用的胶片滤镜模拟软件&am…

ESP32设备驱动-MicroSD Card驱动

MicroSD Card驱动 1、SDCard介绍 SD卡是Secure Digital Card卡的简称,直译成汉语就是“安全数字卡”,是由日本松下公司、东芝公司和美国SANDISK公司共同开发研制的全新的存储卡产品。SD存储卡是一个完全开放的标准(系统),多用于MP3、数码摄像机、数码相机、电子图书、AV器…

代码看不懂?ChatGPT 帮你解释,详细到爆!

偷个懒,用ChatGPT 帮我写段生物信息代码如果 ChatGPT 给出的的代码不太完善,如何请他一步步改好?网上看到一段代码,不知道是什么含义?输入 ChatGPT 帮我们解释下。生信宝典 1: 下面是一段 Linux 代码,请帮…

开学季平价好用电容笔有哪些?ipadpro触控笔推荐

众所周知,苹果原装的Pencil的售价由于比较高,所以很多用户都无法入手。那么,市场上会不会有一款价格上只有苹果Pencil五分之一左右、但功能几乎相同的电容笔?事实上,确实存在。国内的平替电容笔,不管是压感…

二点回调测买 源码

如图所示,两点回调测买点的效果图,这是我们常见的一种预测买点计算方法。 现将源码公布如下: DRAWKLINE(H,O,L,C); N:13; A1:REF(HIGH,N)HHV(HIGH,2*N1); B1:FILTER(A1,N); C1:BACKSET(B1,N1); D1:FILTER(C1,N); A2:REF(LOW,N)LLV(LOW,2*N1…

正交采样

文章目录【 1、欧拉公式的频谱 】【 2、模拟正交采样 】【 3、数字正交采样 】【 1、欧拉公式的频谱 】 对于余弦信号 cos(2πf0t)12ej2πf0t12e−j2πf0tcos(2\pi f_0 t)\frac{1}{2}e^{j2\pi f_0 t}\frac{1}{2}e^{-j2\pi f_0 t}cos(2πf0​t)21​ej2πf0​t21​e−j2πf0​t&a…

Shell基础 (一)

目录 一、关于shell 1、什么是shell? 2、shell入门 二、shell进阶(重点) 1、变量 2、条件判读语句 3、运算符 一、关于shell 1、什么是shell? Shell(外壳)是一个用C语言编写的程序,它是用…

《程序员面试金典(第6版)》面试题 02.08. 环路检测

题目描述 给定一个链表,如果它是有环链表,实现一个算法返回环路的开头节点。若环不存在,请返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环&#xf…

如果想了解营销的最高境界,请看如何开创新品类?

如果想了解营销的最高境界,请看 如何开创新品类? 中国奶粉第一品牌飞鹤奶粉~ 品牌策划人王博总结的方法 趣讲大白话:看看高手怎么想 【安志强趣讲信息科技95期】 ******************************* 不懂品牌营销的程序员不是好厨师…

第一次使用Python for Qt中的问题

在创建带有form的python for qt的时候,使用的库是pySide6,而不是pyqt。 因此,需要安装pyside6。 Running "/usr/bin/python3 -m pip install PySide6 --user" to install PySide6. ERROR: Could not find a version that satisfi…

hivesql实现不同的求和需求【分组求和、帕累托累计求和、滑动求和】

hivesql求和,分组求和,帕累托累计求和,滑动求和 实现功能如下示例: 列s1:分组求和,这里以sku_id分组求和,E5单元格对应sku_ida01时的C列求和; 列s2:帕累托求和&#x…

X264简介-Android使用(一)

X264 简介及使用 1、简介 2、环境搭建 3、使用 4、小结 简介 官网连接:https://www.videolan.org/developers/x264.html 官方文档:https://wiki.videolan.org/Category:X264/ x264是用于编码H.264/MPEG-4 AVC视频流的免费软件库。它世界上最流行的…

每天一个linux命令:性能监控和优化命令之top

top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。下面详细介绍它的使用方法。top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止…

将fluentMeshing网格转换为openFoam网格

简介 fluentMeshing是一个绘制源生多面体网格的强大工具,其生成的网格可以进一步导出,转换为OpenFoam格式,供OpenFoam计算。 本文将介绍如何把fluentMeshing网格转换为openFoam网格,以及其注意事项 步骤 (1&#x…

【QML】锚布局

文章目录1、锚(Anchors)2、一些示例Qt Quick中有两套与布局管理相关的类库,一种是Item Positioner(定位器),一种是Item Layout(布局) 定位器:Row(行定位器&am…

【NLP经典论文阅读】Efficient Estimation of Word Representations in Vector Space(附代码)

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

UE4 c++ Mediaplayer取消自动播放,运行时首帧为黑屏的问题

0,前言 工作需要使用C制作一个ue4的视频插件,其中一个功能是能够选择 运行时是否自动播放 视频的功能。 在实现时遇见了一个问题,取消自动播放之后,运行时首帧是没有取到的,在场景里面看是黑色的。就这个问题我想到了使…