Python数值计算(23)——modified akima插值

1. 数学原理

在前面的Akima插值中,计算斜率使用如下公式:

t_i=\frac{|m_{i+1}-m_i|m_{i-1}+|m_{i-1}-m_{i-2}|m_i}{|m_{i+1}-m_i|+|m_{i-1}-m_{i-2}|},i=3,4

如果记:

w_1=\frac{|m_{i+1}-m_i|}{|m_{i+1}-m_i|+|m_{i-1}-m_{i-2}|}

w_2=\frac{|m_{i-1}-m_{i-2}|}{|m_{i+1}-m_i|+|m_{i-1}-m_{i-2}|}

在出现分母分子同时为零的情况时,会出现NaN的计算结果,Akima他自己也意识到这种问题,因此,在原来的算法上做了修订,也就是Modified Akima算法,有时也被简写为makima算法。修订如下:

w_1=|m_{i+1}-m_i|+|m_{i+1}+m_i|/2

w_2=|m_{i+-1}-m_{i-2}|+|m_{i-1}+m_{i-2}|/2

这样的话,就解决了在出现超过2个点具有连续值时的无法被零除问题,此时t_i=0

2. 算法实现

修改原来的算法如下:

import numpy as np
from numpy.polynomial import Polynomial
import matplotlib.pyplot as pltclass makimaIntp:__coef:np.ndarray__bpx:np.ndarray__bpy:np.ndarraydef __init__(self,x:np.ndarray,y:np.ndarray):n,=x.shapem=np.zeros(n+3)m[2:-2]=np.diff(y)/np.diff(x)m[1]=2*m[2]-m[3]m[0]=2*m[1]-m[2]m[-2]=2*m[-3]-m[-4]m[-1]=2*m[-2]-m[-3]d=np.zeros(n)for i in range(n):# 注意此处修改w1=np.abs(m[i+3]-m[i+2])+np.abs(m[i+3]+m[i+2])/2w2=np.abs(m[i+1]-m[i])+np.abs(m[i+1]+m[i])/2if w1==0 and w2==0:d[i]=(m[i+1]+m[i+2])/2else:d[i]=w1/(w1+w2)*m[i+1]+w2/(w1+w2)*m[i+2]self.__coef=np.zeros((n-1,4))self.__coef[:,0]=y[0:-1]self.__coef[:,1]=d[0:-1]for i in range(n-1):self.__coef[i,2]=(3*(y[i+1]-y[i])/(x[i+1]-x[i])-2*d[i]-d[i+1])/(x[i+1]-x[i])self.__coef[i,3]=(d[i+1]+d[i]-2*(y[i+1]-y[i])/(x[i+1]-x[i]))/(x[i+1]-x[i])/(x[i+1]-x[i])self.__bpx=x.copy()self.__bpy=y.copy()def __call__(self,w:np.ndarray):n,=w.shaperet= np.zeros(n)for i in range(n):if self.__bpx[0]>=w[i]:ret[i]=self.__bpy[0]continueif self.__bpx[-1]<=w[i]:ret[i]=self.__bpy[-1]continuej=0while self.__bpx[j]<w[i]:j+=1cp=self.__coef[j-1,:]p=Polynomial(0)for t in range(len(cp)):p+=cp[t]*Polynomial([-self.__bpx[j-1],1])**tret[i]=p(w[i])return ret@propertydef c(self):return self.__coef@propertydef x(self):return self.__bpx

3. 算法测试

依旧以HIROSHI AKIMA当初论文中的一组数据为例,测试如下:

np.set_printoptions(precision=4,linewidth=100)
# test data
x=np.array([0,1,2,3,4,5,6,7,8,9,10])
y=np.array([10,10,10,10,10,10,10.5,15,50,60,85])aip=makimaIntp(x,y)
print(aip.c)
'''
[[ 10.       0.       0.       0.    ][ 10.       0.       0.       0.    ][ 10.       0.       0.       0.    ][ 10.       0.       0.       0.    ][ 10.       0.       0.       0.    ][ 10.       0.       0.9412  -0.4412][ 10.5      0.5588   4.2111  -0.2699][ 15.       8.1713  68.8387 -42.01  ][ 50.      19.8187 -27.1375  17.3187][ 60.      17.5      9.8684  -2.3684]]
'''

同样的,每一行就是每个分段中的系数p_0,p_1,p_2,p_3

4. 现成算法

Scipy中也有现成的工具包供使用,scipy.interpolate中的Akima1DInterpolator类,可完成该项工作,只需要指定参数method='makima'即可。

akima=Akima1DInterpolator(x,y,method='makima')
print(akima.c)
'''
[[  0.    0.    0.    0.    0.    -0.4412   -0.2699     -42.01      17.3187     -2.3684] [  0.    0.    0.    0.    0.    0.9412    4.2111      68.8387     -27.1375    9.8684] [  0.    0.    0.    0.    0.    0.        0.5588      8.1713      19.8187     17.5   ] [ 10.    10.   10.   10.   10.   10.       10.5        15.         50.         60.    ]]
'''

同样需要注意其系数的组织方式。

最后,对比两者拟合的图形,将其绘制在同一个图表中:

X=np.linspace(x[0],x[-1],100)
Y1=aip(X)
plt.plot(X,Y1,'b-.')
Y2=akima(X)
plt.plot(X,Y2,'r--')
plt.grid()
plt.show()

效果如下:

其中蓝色点画线是我们自己实现的算法,红色虚线是软件包提供的算法,可见两者吻合的非常好。

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

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

相关文章

Python | Leetcode Python题解之第330题按要求补齐数组

题目&#xff1a; 题解&#xff1a; class Solution:def minPatches(self, nums: List[int], n: int) -> int:patches, x 0, 1length, index len(nums), 0while x < n:if index < length and nums[index] < x:x nums[index]index 1else:x << 1patches …

【线性代数】第2章 矩阵及其运算,矩阵的定义,矩阵的加法,矩阵的乘法(同济大学)

目录 1 矩阵 一、矩阵概念的引入 二、矩阵的定义 三、特殊的矩阵 同型矩阵与矩阵相等的概念 四、矩阵与线性变换 例 例 例 2 矩阵的运算 例 一、矩阵的加法 二、数与矩阵相乘 例&#xff08;续&#xff09; 三、矩阵与矩阵相乘 1 矩阵 一、矩阵概…

NVIDIA Triton系列11-模型类别与调度器-1

NVIDIA Triton系列11-模型类别与调度器-1 B站&#xff1a;肆十二-的个人空间-肆十二-个人主页-哔哩哔哩视频 (bilibili.com) 博客&#xff1a;肆十二-CSDN博客 问答&#xff1a;(10 封私信 / 72 条消息) 肆十二 - 知乎 (zhihu.com) 在 Triton 推理服务器的使用中&#xff0c;模…

数据科学 - 数据可视化(持续更新)

1. 前言​​​​​​​ 数据可视化能够将复杂的数据集转化为易于理解的图形、图表或图像。这种直观的表现形式使得人们能够更快地理解数据的分布、趋势、异常值以及数据之间的关系&#xff0c;从而更深入地洞察数据背后的信息。 数据可视化在数据分析和决策制定过程中具有不可…

C++的7种设计模式原则

一、设计模式前言 设计模式&#xff08;Design Patterns&#xff09;的“模式”指的是一种在软件设计中经过验证的、解决特定问题的方案。它们不是具体的代码&#xff0c;而是解决常见设计问题的抽象方案或模板。设计模式提供了一种标准的方式来组织代码&#xff0c;以提高代码…

为JetBrains IDE设置自定义TODO筛选器(筛选指定的关键字)和Live Templates

为JetBrains IDE设置自定义TODO筛选器&#xff08;筛选指定的关键字&#xff09;和Live Templates 以下内容以搜索关键字 // TODO Zzz 为例&#xff0c;不区分大小写&#xff0c;可以将模板中的 Zzz 换成其他内容。 设置自定义TODO筛选器 在IDE设置中找到TODO选项&#xff0…

AWS注册是否必须使用美元银行卡

亚马逊网络服务(AWS)作为全球领先的云计算平台,吸引了众多企业和个人用户。然而,不少人在注册AWS账户时会产生疑问:是否必须使用美元银行卡?实际上,这种说法并不准确。虽然AWS的主要结算货币是美元,但用户在注册和使用过程中有多种支付方式可供选择。我们结合九河云的分析来告…

程序员前端开发者的AI绘画副业之路:在裁员危机中寻找新机遇

正文&#xff1a; 在这个充满变数的时代&#xff0c;作为一名前端开发者&#xff0c;我经历了行业的起伏&#xff0c;见证了裁员危机和中年失业危机的残酷。在这样的背景下&#xff0c;我开始了利用AI绘画作为副业的探索&#xff0c;不仅为了寻求经济上的稳定&#xff0c;更是为…

DLMS/COSEM中的信息安全:安全密钥(下)

2.5组件B终端实体证书类型要由DLMS/COSEM服务器支持 每个DLMS/COSEM服务器应使用X.509 v3格式&#xff0c;并包含以下任一项&#xff1a; ——具有P-256或P-384 ECDSA功能的签名密钥&#xff1b;或 ——具有P-256或P-384 ECDSA功能的密钥协商密钥。 每张证书均应使用ECDSA进行签…

lvs(linux virtual server)实例

一.lvs概述 1.1什么是lvs LVS&#xff08;Linux Virtual Server&#xff09;是一个基于Linux操作系统的虚拟服务器技术&#xff0c;用于实现负载均衡和高可用性。LVS通过将客户端的请求分发到多台后端服务器上&#xff0c;从而提高整体服务的处理能力和可靠性。LVS主要有两个组…

蓝桥杯 双周赛 第16场 小白赛 题目复盘 (2024年8月10日)

3. 织女的考验 下面的代码看似很正确&#xff0c;但忽略了一个细节&#xff0c;下面判断是否有字母数量不同时&#xff0c;用abs(cnt[i]) 1判断&#xff0c;这里忽略了abs(cnt[i]) 等于其他值的情况(YES和NO都存在) #include <iostream> #include <cstring> usi…

java: 程序包org.springframework.boot.autoconfigure不存在

通过 mvn -U idea:idea 命令重新加载maven包&#xff0c;具体操作是这样的&#xff1a; 打开cmd窗口cd 到 工程根目录&#xff0c;比如我的工程是&#xff1a;D:\IdeaProjects\demo&#xff0c; 执行 mvn -U idea:idea 命令&#xff0c;完了以后重新运行项目就正常了&#xff…

《网络编程实战系列》(17)网络桥接模式

文章目录 **桥接模式的基本原理****桥接模式的应用场景****桥接模式的优缺点****桥接模式的实现****总结**桥接模式(Bridge Mode)是一种网络配置模式,用于将多个网络接口或网络段连接在一起,使其在逻辑上形成一个单一的网络。这种模式常用于在不同网络之间传递数据包,并使…

树与二叉树、图的基本概念

一、树与二叉树的基本概念和性质 1. 树的的性质 1&#xff09;树中的结点数 n 等于所有结点的度数之和加 1 【说明】结点的度是指该结点的孩子数量&#xff0c;每个结点与其每个孩子都由唯一的边相连&#xff0c;因此树中所有结点的度数之和等于树中的边数之和。树中的结点&…

pr涂鸦转场(喷漆涂鸦效果视频转场过渡效果)mogrt模板

https://prmuban.com/40353.html 主要特点&#xff1a; 与Adobe Premiere Pro 2024兼容 4K分辨率&#xff08;38402160&#xff09; 自动调整大小功能 快速渲染时间 无需额外插件 包括视频教程

240806-在Linux/RHEL开机中自动启动bash脚本

A. 常规方法 要在Red Hat Enterprise Linux (RHEL) 中设置开机启动的bash脚本&#xff0c;可以使用以下方法之一&#xff1a; 方法1&#xff1a;使用/etc/rc.d/rc.local 打开/etc/rc.d/rc.local文件&#xff1a; sudo vi /etc/rc.d/rc.local在文件末尾添加你想要执行的bash脚…

<Qt> 窗口

目录 一、Qt窗口 二、菜单栏 &#xff08;一&#xff09;创建菜单栏 &#xff08;二&#xff09;在菜单栏中添加菜单 &#xff08;三&#xff09;创建菜单项 &#xff08;四&#xff09;在菜单项之间添加分割线 &#xff08;五&#xff09;给菜单项添加槽函数 &#xf…

虚拟机和docker容器的区别

背景 我们知道虚拟机和docker容器中的进程都可以在独立的空间中运行&#xff0c;互不干扰&#xff0c;那么两者主要区别是什么呢 虚拟机和docker容器的区别 虚拟机主要是通过硬件模拟出来一个个操作系统&#xff0c;每个操作系统有自己的的文件和目录&#xff0c;网络设备等…

最新HTML设计搜索表单

设计搜索表单 页眉中包含表单&#xff0c;表单中只需包含label和Input. 实现如下效果&#xff1a;文本框动态变宽效果 代码&#xff1a;6.2.4.设计搜索表单.html <!DOCTYPE html> <html><head><meta charset"utf-8"><title></t…

第R2周:Tensorflow2实现:LSTM-火灾温度预测

本文为365天深度学习训练营 中的学习记录博客原作者&#xff1a;K同学啊 任务说明&#xff1a;数据集中提供了火灾温度&#xff08;Tem1&#xff09;、一氧化碳浓度&#xff08;CO 1&#xff09;、烟雾浓度&#xff08;Soot 1&#xff09;随着时间变化数据&#xff0c;我们需要…