分段三次hermit插值

news2024/12/29 8:42:46

保形三次hermit插值

一、算法实现

一、插值函数建立

设函数 y = F ( x ) y=F(x) y=F(x)在区间 [ a , b ] [a,b] [a,b]上有定义,且已知在离散点 a = x 0 < x 1 < . . . < x n = b a=x_0<x_1<...<x_n = b a=x0<x1<...<xn=b上的值 y 0 , y 1 , . . . y n , y_0,y_1,...y_n, y0,y1,...yn f ( x ) f(x) f(x) [ x j , x j + 1 ] [x_j,x_{j+1}] [xj,xj+1]分段区间内可表示为
f ( x ) = a ( x − x j ) 3 + b ( x − x j ) 2 + c ( x − x j ) + d f(x) = a(x-x_j)^3 +b(x-x_j)^2 + c(x-x_j) + d f(x)=a(xxj)3+b(xxj)2+c(xxj)+d
f ′ ( x ) f'(x) f(x)是一阶导数,则
f ′ ( x ) = 3 a ( x − x j ) 2 + 2 b ( x − x j ) + c f'(x) = 3a(x-x_j)^2 + 2b(x-x_j) + c f(x)=3a(xxj)2+2b(xxj)+c
将端点处 f ( x j ) = y j f(x_j) = y_j f(xj)=yj f ( x j + 1 ) = y j + 1 f(x_{j+1}) = y_{j+1} f(xj+1)=yj+1 带入得
{ f ( x j ) =   d f ′ ( x j ) =   c f ( x j + 1 ) =   a ( x j + 1 − x j ) 3 + b ( x j + 1 − x j ) 2 + c ( x j + 1 − x j ) f ′ ( x j + 1 ) =   3 a ( x j + 1 − x j ) 2 + 2 b ( x j + 1 − x j ) + c \left\{ \begin{aligned} f(x_j) & = \ d \\ f'(x_j) & = \ c \\ f(x_{j+1}) & = \ a(x_{j+1}-x_j)^3 + b(x_{j+1}- x_j)^2 + c(x_{j+1} - x_j) \\ f'(x_{j+1}) & = \ 3a(x_{j+1}-x_j)^2 + 2b(x_{j+1}- x_j) + c \end{aligned} \right. f(xj)f(xj)f(xj+1)f(xj+1)= d= c= a(xj+1xj)3+b(xj+1xj)2+c(xj+1xj)= 3a(xj+1xj)2+2b(xj+1xj)+c
可得关于 a , b a,b a,b 的方程为
{ a ( x j + 1 − x j ) 3 + b ( x j + 1 − x j ) 2 = f ( x j + 1 ) − f ( x j ) − f ′ ( x j ) − f ′ ( x j ) ( x j + 1 − x j ) 3 a ( x j + 1 − x j ) 2 + 2 b ( x j + 1 − x j ) = f ′ ( x j + 1 ) − f ′ ( x j ) \left\{ \begin{aligned} a(x_{j+1} - x_j)^3 + b(x_{j+1}-x_j)^2 & = f(x_{j+1}) -f(x_j) - f'(x_j)- f'(x_j)(x_{j+1}-x_{j}) \\ 3a(x_{j+1}-x_j)^2 + 2b(x_{j+1} - x_j) & = f'(x_{j+1}) - f'(x_j) \end{aligned} \right. {a(xj+1xj)3+b(xj+1xj)23a(xj+1xj)2+2b(xj+1xj)=f(xj+1)f(xj)f(xj)f(xj)(xj+1xj)=f(xj+1)f(xj)
x j x_j xj 处的差商 δ j = f ( x j + 1 ) − f ( x j ) x j + 1 − x j \delta_j = \frac{f(x_{j+1}) - f(x_j)}{x_{j+1}-x_j} δj=xj+1xjf(xj+1)f(xj) x j x_j xj 处的一阶导 d j = f ′ ( x j ) d_j = f'(x_j) dj=f(xj) d z z d x = δ j − d j x j + 1 − x j , d z d x d x = d j + 1 − δ j x j + 1 − x j dzzdx = \frac{δ_j - d_j}{x_{j+1} - x_j},dzdxdx = \frac{d_{j+1} - δ_j}{x_{j+1}-x_{j}} dzzdx=xj+1xjδjdjdzdxdx=xj+1xjdj+1δj,上式可表示为
{ a ( x j + 1 − x j ) + b = d z z d x 3 a ( x j + 1 − x j ) + 2 b = d z d x d x + d z z d x \left\{ \begin{aligned} a(x_{j+1} - x_j) + b & = dzzdx\\ 3a(x_{j+1} - x_j ) +2b & = dzdxdx + dzzdx \end{aligned} \right. {a(xj+1xj)+b3a(xj+1xj)+2b=dzzdx=dzdxdx+dzzdx
解方程组得
{ a = d z d x d x − d z z d x x j + 1 − x j b = 2 d z z d x − d z d x d x \left\{ \begin{aligned} a & = \frac{dzdxdx - dzzdx}{x_{j+1} - x_j} \\ b & = 2dzzdx - dzdxdx \end{aligned} \right. ab=xj+1xjdzdxdxdzzdx=2dzzdxdzdxdx

h j = x j + 1 − x j h_j = x_{j+_1} - x_j hj=xj+1xj,最终得出
{ a = d j + 1 + d j − 2 δ j h j 2 b = − d j + 1 − 2 d j + 3 δ j h j c = f ′ ( x j ) = d j d = f ( x j ) = y j \left\{ \begin{aligned} a & = \frac{d_{j+1} + d_j - 2\delta_j}{{h_j} ^2} \\ b & = \frac{-d_{j+1} - 2d_j + 3\delta_j}{h_j} \\ c & = f'(x_j) = d_j \\ d & = f(x_j) = y_j \end{aligned} \right. abcd=hj2dj+1+dj2δj=hjdj+12dj+3δj=f(xj)=dj=f(xj)=yj
其中 h j 、 δ j 、 y j h_j、\delta_j、y_j hjδjyj 均已知,求出 x j 、 x j + 1 x_j、x_{j+1} xjxj+1 处的导数 d j 、 d j + 1 d_j、d_{j+1} djdj+1 方程得解

二、一阶导数求法

一、内点处的导数求法

内点处的一阶导数有以下规则:

  1. 如果第 k k k 个节点附近的差商 δ k − 1 δ_{k-1} δk1 δ k δ_{k} δk 符号相反,或者其中一个为0,则该点处的一阶导数 d k = 0 d_k = 0 dk=0
  2. 如果第 k k k 个节点附近的差商 δ k − 1 δ_{k-1} δk1 δ k δ_{k} δk 符号相同,则改点处的导数
    d k + 1 = δ m i n k w 1 k δ k δ m a x k + w 2 k δ k + 1 δ m a x k d_{k+1} = \frac {\delta min_k }{w1_k \frac{\delta_k}{\delta max_k} + w2_k \frac{\delta_{k+1}}{\delta max_k}} dk+1=w1kδmaxkδk+w2kδmaxkδk+1δmink
    其中 h k = ( x k + 1 − x k ) , h s k = h k + h k + 1 , δ k = y k + 1 − y k x k + 1 − x k , δ m i n k = m i n ( δ k , δ k + 1 ) , δ m a x k = m a x ( δ k , δ k + 1 ) , w 1 k = h k + h s k 3 h s k , w 2 k = h k + 1 + h s k 3 h s k 其中 h_k = (x_{k+1}-x_k),hs_k = h_k + h_{k+1}, \delta_k = \frac{y_{k+1} - y_k}{x_{k+1} - x_{k}},\delta min_k = min(\delta_{k},\delta_{k+1}),\delta max_k = max(\delta_{k},\delta_{k+1}) ,w1_k = \frac{h_k + hs_k}{3hs_k},w2_k = \frac{h_{k+1} + hs_k}{3hs_k} 其中hk=(xk+1xk)hsk=hk+hk+1δk=xk+1xkyk+1ykδmink=min(δk,δk+1)δmaxk=max(δk,δk+1)w1k=3hskhk+hskw2k=3hskhk+1+hsk

二、端点处的导数求法

{ d 0 = ( 2 h 0 + h 1 ) δ 0 − h 0 δ 1 ( h 0 + h 1 ) d n = ( 2 h n − 1 + h n − 2 ) δ n − 1 − h n − 1 δ n − 2 ( h n − 2 + h n − 1 ) \left\{ \begin{aligned} d_0 & = \frac{(2h_0 + h_1)\delta_0 - h_0\delta_1}{(h_0+h_1)} \\ d_n & = \frac{(2h_{n-1}+h_{n-2})\delta_{n-1} - h_{n-1}\delta_{n-2}}{(h_{n-2}+h_{n-1})} \end{aligned} \right. d0dn=(h0+h1)(2h0+h1)δ0h0δ1=(hn2+hn1)(2hn1+hn2)δn1hn1δn2

二、实验仿真

# -*- encoding: utf-8 -*-
'''
@File    :   pchip.py
@Time    :   2023/03/01 11:40:41
@Author  :   answer
'''

# here put the import lib
import numpy as np
from matplotlib import pyplot as plt
from scipy import interpolate

def find_0point(delta):
    k = []
    for i in range(len(delta)-1):
        if delta[i] * delta[i+1] > 0:
            k.append(i)
    return k

# 三次分段hermit函数
def pchip_spline(x, y, frequence):
    # x,y差分
    x_diff = []
    y_diff = []
    delta = []
    for i in range(len(x)-1):
        x_diff.append(x[i+1] - x[i])
        y_diff.append(y[i+1] - y[i])
        delta.append(y_diff[i]/x_diff[i])
    # 节点导数
    n = len(x)
    slope = [0 for i in range(n)]
    if n == 2:
        slope = [delta[0] for i in range(n)]
    else:
        k = find_0point(delta)
        for i in range(len(k)):
            index = k[i]
            dx_diff = x_diff[index] + x_diff[index + 1]
            w1 = (x_diff[index] + dx_diff) / (3 * dx_diff)
            w2 = (x_diff[index + 1] + dx_diff) / (3 * dx_diff)
            dmax = max(abs(delta[index]), abs(delta[index+1]))
            dmin = min(abs(delta[index]), abs(delta[index+1]))
            slope[index + 1] = dmin / \
                (w1*delta[index]/dmax + w2*delta[index+1]/dmax)
        slope[0] = 0

    # 库函数默认端点导数不为0 interpolate.pchip_interpolate(x, y, x_pchip)
    # slope[0] = ((2 * x_diff[0] + x_diff[1]) * delta[0] -
    #             x_diff[0] * delta[1]) / (x_diff[0] + x_diff[1])
    # if slope[0] * delta[0] < 0:
    #     slope[0] = 0
    # elif (delta[0] * delta[1] < 0) & (abs(slope[0]) > 3 * abs(delta[0])):
    #     slope[0] = 3 * delta[0]
    # print(slope)

    # slope[n - 1] = ((2 * x_diff[n - 2] + x_diff[n - 3]) * delta[n - 2] -
    #                 x_diff[n - 2] * delta[n - 3]) / (x_diff[n - 3] + x_diff[n - 2])
    # if delta[n - 2] * slope[n - 1] < 0:
    #     slope[n - 1] = 0
    # elif (delta[n - 2] * delta[n - 3] < 0) & (abs(slope[n - 1]) > 3 * abs(delta[n - 2])):
    #     slope[n - 1] = 3 * delta[n - 2]
    # print(slope)

    # hermit spline
    x_hermit = []
    y_hermit = []
    for i in range(n - 1):
        # 计算多项式系数
        a = (slope[i + 1] + slope[i] - 2 * delta[i]) / (x_diff[i]**2)
        b = (3 * delta[i] - 2 * slope[i] - slope[i + 1]) / x_diff[i]
        c = slope[i]
        d = y[i]

        # 计算插值点
        for j in range(frequence):
            x_inter = x[i] + j * (x[i+1] - x[i]) / frequence
            x_hermit.append(x_inter)
            y_hermit.append(
                a * (x_inter - x[i])**3 + b * (x_inter - x[i])**2 + c * (x_inter - x[i]) + d)
    x_hermit.append(x[n-1])
    y_hermit.append(y[n-1])
    return x_hermit, y_hermit

if __name__ == '__main__':
    frequence = 10
    x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
    y = [0, 1.5, 0, 0, 0.5, 0.4, 1.2, 1.2,
         0.1, 0, 0.3, 0.6]
    x_pchip, y_pchip = pchip_spline(x, y, frequence)

    y_ = interpolate.pchip_interpolate(x, y, x_pchip)
    y_1 = interpolate.splrep(x, y)
    y_1 = interpolate.splev(x_pchip, y_1)
    y_2 = interpolate.Akima1DInterpolator(x, y)
    y_2 = y_2(x_pchip)
    y_3 = interpolate.interp1d(x, y, 'cubic')
    y_3 = y_3(x_pchip)

    plt.subplot(2, 2, 1)
    plt.plot(x, y, "o", label='sample point')
    plt.plot(x_pchip, y_, linewidth=3.0, label="scipy_pchip")
    plt.plot(x_pchip, y_1, color='lime', label="spline")
    plt.legend()

    plt.subplot(2, 2, 2)
    plt.plot(x, y, "o", label='sample point')
    plt.plot(x_pchip, y_, linewidth=3.0, label="scipy_pchip")
    plt.plot(x_pchip, y_3, color='blueviolet', label="cubic")
    plt.legend()

    plt.subplot(2, 2, 3)
    plt.plot(x, y, "o", label='sample point')
    plt.plot(x_pchip, y_, linewidth=3.0, label="scipy_pchip")
    plt.plot(x_pchip, y_2, color='dodgerblue', label="akima")
    plt.legend()

    plt.subplot(2, 2, 4)
    plt.plot(x, y, "o", label='sample point')
    plt.plot(x_pchip, y_, linewidth=3.0, label="pchip_scipy")
    plt.plot(x_pchip, y_pchip, color='gray', label="pchip d_point=0")
    plt.legend()

    plt.subplots_adjust(left=0.04, bottom=0.05, right=0.98,
                        top=0.98, wspace=0.08, hspace=0.1)
    plt.show()

  1. ( 0 , 4 ) , ( 1 , 3 ) , ( 2 , 4 ) , ( 3 , 6 ) , ( 5 , 7 ) , ( 6 , 5 ) , ( 8 , 8 ) , ( 11 , 1 ) (0,4),(1,3),(2,4),(3,6),(5,7),(6,5),(8,8),(11,1) (0,4)(1,3)(2,4)(3,6)(5,7)(6,5)(8,8)(11,1) 作为节点,每点之间插十次
    在这里插入图片描述

  2. 对阶跃信号进行插值
    在这里插入图片描述

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

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

相关文章

关于Maxwell与Kafka和数据库的监控

1.Maxwell的配置 其实就是配置两端的配置信息,都要能连接上,然后才能去传输数据 config.properties #Maxwell数据发送目的地&#xff0c;可选配置有stdout|file|kafka|kinesis|pubsub|sqs|rabbitmq|redis producerkafka # 目标Kafka集群地址 kafka.bootstrap.servershadoop102…

立创EDA专业版的原理图上器件有一个虚线框

立创EDA专业版的原理图上器件有一个虚线框解决方法 问题分析&#xff1a; 在使用立创EDA专业版 设计电路原理图时&#xff0c;中途莫名其妙就给我的元件添加了下面图片所示的虚线外框。看着就很别扭的样子&#xff0c;而且工程大了和器件稍微布局比较密的时候就导致整体很难看…

Python+selenium等待某个元素消失(如加载中)再继续执行代码

&#x1f338; 欢迎来到Python办公自动化专栏—Python处理办公问题&#xff0c;解放您的双手 &#x1f3f3;️‍&#x1f308; 博客主页&#xff1a;一晌小贪欢的博客主页 &#x1f44d; 该系列文章专栏&#xff1a;Python办公自动化专栏 文章作者技术和水平有限&#xff0c…

【ASP.NET】LIS实验室信息管理系统源码

LIS系统&#xff0c;即实验室信息管理系统&#xff0c;是一种基于互联网技术的医疗行业管理软件&#xff0c;它可以帮助实验室进行样本管理、检测流程管理、结果报告等一系列工作&#xff0c; 提高实验室工作效率和质量。 一、LIS系统的功能 1. 样本管理 LIS系统可以帮助实验…

用反射实现自定义Java对象转化为json工具类

传入一个object类型的对象获取该对象的class类getFields方法获取该类的所有属性对属性进行遍历&#xff0c;并且拼接成Json格式的字符串&#xff0c;注意&#xff1a;通过属性名来推断方法名获取Method实例通过invoke方法调用 public static String objectToJsonUtil(Object o…

轻松搭建微信小程序商城的详细指南

微信小程序商城是目前非常流行的一种电商模式&#xff0c;它能够为用户提供便捷的购物体验&#xff0c;同时也成为了很多企业开展电商业务的首选方式。那么&#xff0c;如何快速、简单地搭建一个微信小程序商城呢&#xff1f;下面就为大家介绍一下详细的步骤。 首先&#xff0c…

分布式系统,你了解多少呢

本期只是简单了解&#xff0c;想要深入学习&#xff0c;还需要看看其他资源~ 目录 一、单机架构 二、数据库和应用分离 三、负载均衡——应用服务器 四、读写分离——数据库主从结构 五、引入缓存——冷热数据分离 六、分库分表——数据库扩展空间 七、微服务——进一步…

性能测试常见的测试指标

一、什么是性能测试 先看下百度百科对它的定义 性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。我们可以认为性能测试是&#xff1a;通过在测试环境下对系统或构件的性能进行探测&#xff0c;用以验证在生产环境下系统性能…

Rtab-map

Rtab-map -- 开源 2014 about 如何实现闭环检测 可视化slam 应用于摄像头上 原理&#xff1a;数据结构&#xff0c;点中存储彩色图&#xff0c;深度图&#xff0c;和用来做odomtry得位置&#xff0c;可以认为图片&#xff0c;location和image都是点 将图片解析为一些feature…

摄像头的调用和视频识别

CV_tutorial3 摄像头调用实时播放保存视频 运动目标识别帧差法背景减除法 摄像头调用 创建视频捕捉对象&#xff1a;cv2.VideoCapture() 参数为视频设备的索引号&#xff0c;就一个摄像投的话写0默认&#xff1b; 或者是指定要读取视频的路径。 实时播放 import cv2 import …

【算法】经典的八大排序算法

点击链接 可视化排序 动态演示各个排序算法来加深理解&#xff0c;大致如下 一&#xff0c;冒泡排序&#xff08;Bubble Sort&#xff09; 原理 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法&#xff0c;它通过多次比较和交换相邻元素的方式&#xff0c;将…

实战 图书馆系统管理案例

config &#xff1a;敏感的配置一般都是在配置中心配置&#xff0c;比如consul或者阿波罗上面controller &#xff1a;写一些handler的&#xff0c;拿到参数要去调用service层的逻辑。&#xff08;只负责接受参数&#xff0c;怎么绑定参数&#xff0c;要去调用哪个service的&am…

QT6修改程序图标和名字以及打包部署

首先确定已经编译成功无错误 修改窗口的名字 修改图标 当有pro工程文件时&#xff0c; 只需要将ico文件放在工程文件的同级文件夹中&#xff0c;然后在pro文件中加入RC_ICONSico文件的名字 当使用cmake建立工程时 参考&#xff1a;https://blog.csdn.net/chqaz123/article…

PowerBuilder调用外部VB6 ActiveX EXE公共对象

学习的同时习练PowerBuilder对VB6 ActiveX exe公共对象的调用&#xff0c;初步感觉PowerBuilder调用DLL还是要求比较严格的&#xff0c;APP和powerbuilder本身都比较脆弱、易崩溃&#xff0c;因此&#xff0c; 1. 直接调用外部DLL时&#xff0c;传递地址参数&#xff0c;尽量不…

音频接口电路的PCB设计注意事项

Audio接口是音频插孔&#xff0c;即音频接口&#xff0c;可分为Audio in接口和Audio out接口。音频接口是连接麦克风和其他声源与计算机的设备&#xff0c;其在模拟和数字信号之间起到了桥梁连接的作用。 其余走线要求如下&#xff1a; 1、所有CLK信号建议串接22ohm电阻&#…

【零基础算法】Vector动态数组

为什么开始先更新数据结构&#xff1f;博主其实一开始也不怎么喜欢调这些数据&#xff0c;觉得用C语言造轮子才是最好的。后面学习过程中学习的算法逐渐复杂&#xff0c;实际上会发现&#xff0c;了解和调用一些已经写好的库工具是很方便的一件事&#xff0c;我们需要做的是知道…

计算机竞赛 基于机器视觉的手势检测和识别算法

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的手势检测与识别算法 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng…

伺服电机驱动器EMC处理方案

伺服驱动器内部也有低压单元&#xff0c; 很可能受到驱动器外围设备的噪音干扰&#xff0c;受到干扰的信号可能会引起设备做出意想不到的动作 为防止伺服驱动器和其外围设备之间的相互电磁干扰&#xff0c; 可根据采取以下的对策&#xff1a; ● 请务必使驱动器及电机良好的接…

USB与蓝牙通信原理图设计

蓝牙模块设计&#xff1a; USB2.0 ----ESD保护芯片---- USB转串口芯片&#xff08;CP2104-F03-GMR&#xff09;--------- PTR5618蓝牙模块 ---------- PTR5618的GPIO0\GPIO1作为IIC与EEPROM芯片通信 &#xff08;AT24CS04-STUM-T&#xff09; 磁珠的作用是一直EMI干扰。 一…

《Go 语言第一课》课程学习笔记(十二)

函数 Go 函数与函数声明 在 Go 语言中&#xff0c;函数是唯一一种基于特定输入&#xff0c;实现特定任务并可返回任务执行结果的代码块&#xff08;Go 语言中的方法本质上也是函数&#xff09;。在 Go 中&#xff0c;我们定义一个函数的最常用方式就是使用函数声明。 第一部…