分段三次hermit插值

保形三次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 interpolatedef 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 splinex_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]) / frequencex_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_hermitif __name__ == '__main__':frequence = 10x = [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.rhkb.cn/news/110714.html

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

相关文章

Linux 查看当前文件夹下的文件大小

1.直接查看: ll 或者 ls -la #查看文件大小&#xff0c;以kb为单位 ll#查看文件大小&#xff0c;包含隐藏的文件&#xff0c;以kb为单位 ls -la2.以 M 或者 G 为单位查看&#xff0c;根据文件实际大小进行合适的单位展示 du -sh *

k8s集群搭建

文章目录 前言一、前置准备1.1 虚拟机准备1.2 关闭swap分区1.3 将桥接的IPv4流量传递到iptables链1.4 开启ipvs 二、容器化环境和组件安装2.1 docker安装2.2 设置docker加速镜像器2.4 设置yum镜像源2.5 安装kubeadm、kubelet和kubectl 三、集群搭建3.1 安装k8s所需镜像3.2 在ha…

LAMP 配置与应用

LAMP 架构的组成 LAM(M)P&#xff1a; L&#xff1a;linux A&#xff1a;apache (httpd) M&#xff1a;mysql, mariadb P&#xff1a;php, perl, python apache的功能&#xff1a; 第一&#xff1a;处理http的请求、构建响应报文等自身服务&#xff1b; 第二&#xff1a…

【C#学习笔记】数据类中常用委托及接口——以List<T>为例

文章目录 List\<T\>/LinkedList \<T\>为什么是神&#xff1f;&#xff08;泛型为什么是神&#xff09;一些常见&#xff0c;通用的委托和接口ComparisonEnumerator List<T>/LinkedList <T>为什么是神&#xff1f;&#xff08;泛型为什么是神&#xff0…

数据结构(Java实现)-栈和队列

栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。 先进后出 栈的使用 栈的模拟实现 上述的主要代码 public class MyStack {private int[] elem;private int usedSize;public MyStack() {this.elem new int[5];}Overridepublic …

-9501 MAL系统没有配置或者服务器不是企业版(dm8达梦数据库)

dm8达梦数据库 -9501 MAL系统没有配置或者服务器不是企业版&#xff09; 环境介绍1 环境检查2 问题原因 环境介绍 搭建主备集群时&#xff0c;遇到报错-9501 MAL系统没有配置或者服务器不是企业版 1 环境检查 检查dmmal.ini配置文件权限正确 dmdba:dinstall&#xff0c;内容正…

3.RabbitMQ 架构以及 通信方式

一、RabbitMQ的架构 RabbitMQ的架构可以查看官方地址 可以看出RabbitMQ中主要分为三个角色&#xff1a; Publisher&#xff1a;消息的发布者&#xff0c;将消息发布到RabbitMQ中的ExchangeRabbitMQ服务&#xff1a;Exchange接收Publisher的消息&#xff0c;并且根据Routes策…

安装虚拟机

软硬件准备 软件&#xff1a;推荐使用VMwear&#xff0c;我用的是VMwear 12 镜像&#xff1a;CentOS7 ,如果没有镜像可以在官网下载 &#xff1a;http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1804.iso 硬件&#xff1a;因为是在宿主机上运行虚拟…

Android屏幕显示 android:screenOrientation configChanges 处理配置变更

显示相关 屏幕朝向 https://developer.android.com/reference/android/content/res/Configuration.html#orientation 具体区别如下&#xff1a; activity.getResources().getConfiguration().orientation获取的是当前设备的实际屏幕方向值&#xff0c;可以动态地根据设备的旋…

Maven之hibernate-validator 高版本问题

hibernate-validator 高版本问题 hibernate-validator 的高版本&#xff08;邮箱注解&#xff09;依赖于高版本的 el-api&#xff0c;tomcat 8 的 el-api 是 3.0&#xff0c;满足需要。但是 tomcat 7 的 el-api 只有 2.2&#xff0c;不满足其要求。 解决办法有 2 种&#xff…

RocketMQ mqadmin java springboot python 调用笔记

命令 mqadmin命令列表 yeqiangyeqiang-MS-7B23:/opt/rocketmq-all-5.1.3-bin-release$ sh bin/mqadmin The most commonly used mqadmin commands are:updateTopic Update or create topicdeleteTopic Delete topic from broker and NameServer.…

【深度学习_TensorFlow】过拟合

写在前面 过拟合与欠拟合 欠拟合&#xff1a; 是指在模型学习能力较弱&#xff0c;而数据复杂度较高的情况下&#xff0c;模型无法学习到数据集中的“一般规律”&#xff0c;因而导致泛化能力弱。此时&#xff0c;算法在训练集上表现一般&#xff0c;但在测试集上表现较差&…

亿发浙江生产工厂信息化建设管理平台,实现生产智能化、数字化

在全球化、科技深刻变革的时代&#xff0c;浙江省信息化建设正迎来新的发展机遇。以物联网、人工智能大数据、为代表的新技术应用&#xff0c;为人类社会带来了智能、便捷&#xff0c;也标志着新一代信息化浪潮已经到来。特别是在生产型企业中&#xff0c;智能制造是生产型企业…

运用Python解析HTML页面获取资料

在网络爬虫的应用中&#xff0c;我们经常需要从HTML页面中提取图片、音频和文字资源。本文将介绍如何使用Python的requests库和BeautifulSoup解析HTML页面&#xff0c;获取这些资源。 一、环境准备 首先&#xff0c;确保您已经安装了Python环境。接下来&#xff0c;我们需要安…

HUT23级训练赛

目录 A - tmn学长的字符串1 B - 帮帮神君先生 C - z学长的猫 D - 这题用来防ak E - 这题考察FFT卷积 F - 这题考察二进制 G - 这题考察高精度 H - 这题考察签到 I - 爱派克斯&#xff0c;启动! J - tmn学长的字符串2 K - 秋奕来买瓜 A - tmn学长的字符串1 思路&#x…

CSS中如何实现背景图片的平铺和定位?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 平铺背景图片⭐ 背景图片定位⭐ 同时设置平铺和定位⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是…

3D点云处理:基于2D边缘提取的方法提取3D点云边缘(占位待补充)

文章目录 0. 实现效果 微信&#xff1a;dhlddx B站演示视频 0. 实现效果

1.1 数据库系统简介

思维导图&#xff1a; 1.1.数据库系统简介 前言&#xff1a; 数据库系统是一个软件系统&#xff0c;用于管理和操作数据库。它提供了一个组织良好、高效并能够方便存取的数据存储机制&#xff0c;并且能够支持各种数据操作、事务管理、并发控制和恢复功能。以下是数据库系统的…

基于PIC单片机温度-脉搏-DS18B20温度-液晶12864显示(proteus仿真+源程序)

一、系统方案 1、上电初始化液晶第一行显示脉搏&#xff0c;第二行显示温度&#xff0c;第三行显示模式&#xff0c;第四行显示强度&#xff1b;按下K1按键可以选择模式&#xff0c;催眼模式或治疗模式。 2、治疗模块下&#xff0c;可以通过K2、K3修改强度。 二、硬件设计 原理…

c++之指针

总结性质 我们如何在一个函数中获取数组的长度&#xff1a; 我们都知道&#xff0c;在main函数中我们获得数组的长度只需要使用sizeof&#xff08;a&#xff09;/sizeof&#xff08;a【0】&#xff09;即可获得&#xff0c;但当我们把一个数组传入到方法时&#xff0c;c默认把…