makima
修正Akima分段三次Hermite插值
描述
例子
余弦数据的Akima插值
使用makima
在不均匀间隔的样本点上插值余弦曲线。
X = [0 1 2.5 3.6 5 7 8.1 10];y = cos (x);xq = 0: .25:10;yq = makima (x, y, xq);情节(x, y,“o”xq yq,“——”)
利用振荡函数,Akima算法使曲线在局部极值附近变平。为了补偿这种扁平化,可以在局部极值附近添加更多的样本点。
在附近添加样本点 而且 重新绘制插值图。
X = [0 1 2.5 3.6 5 6.5 7 8.1 9 10];y = cos (x);xq = 0: .25:10;yq = makima (x, y, xq);情节(x, y,“o”xq yq,“——”)
数据插值样条
,pchip
,makima
的插值结果进行比较样条
,pchip
,makima
两个不同的数据集。这些函数都执行不同形式的分段三次埃尔米特插值。每个函数计算插值函数斜率的方式不同,这导致当底层数据有平坦区域或波动时,会有不同的行为。
在连接平坦区域的样本数据上比较插补结果。创建向量x
这些点的函数值y
,以及查询点xq
.在查询点上计算插值样条
,pchip
,makima
.在查询点绘制插值函数值以进行比较。
x =三3;Y = [-1 -1 -1 0 1 1 1];xq1 = 3: .01:3;p = pchip (x, y, xq1);s =花键(x, y, xq1);m = makima (x, y, xq1);情节(x, y,“o”xq1, p,“- - -”xq1年代,“-”。xq1, m,“——”)传说(采样点的,“pchip”,样条的,“makima”,“位置”,“东南”)
在这种情况下,pchip
而且makima
具有类似的行为,它们避免过冲,并可以准确地连接平面区域。
使用振荡样本函数进行第二次比较。
x = 0:15;y = besselj (1, x);xq2 = 0:0.01:15;p = pchip (x, y, xq2);s =花键(x, y, xq2);m = makima (x, y, xq2);情节(x, y,“o”xq2, p,“- - -”xq2年代,“-”。xq2, m,“——”)传说(采样点的,“pchip”,样条的,“makima”)
当函数是振荡的,样条
而且makima
捕捉点之间的移动比pchip
它在局部极值附近被猛烈地压平。
分段多项式结构的Akima插值
为样本点创建向量x
以及这些点的值y
.使用makima
为数据构造一个分段多项式结构。
x = 5;Y = [1 1 1 0 0 1 1 2 2 2];页= makima (x, y)
页=结构体字段:形式:'pp'断:[-5 -4 -3 -2 -1 0 1 2 3 4 5]coefs: [10x4双]piece: 10 order: 4 dim: 1
该结构包含了跨度数据的10个4阶多项式的信息。pp.coefs(我,:)
包含在断点定义的区域内有效的多项式的系数((我)(i + 1)休息)
.
使用结构ppval
计算在几个查询点上的插值,然后绘制结果。在有三个或更多常数点的区域,Akima算法用一条直线连接这些点。
xq = 5:0.2:5;m = ppval (pp、xq);情节(x, y,“o”xq, m,“-”。) ylim ([-0.2 - 2.2])
输入参数
x
- - - - - -采样点
向量
样本点,指定为一个向量。向量x
指定数据所处的点y
是给定的。的元素x
必须是唯一的。
数据类型:单
|双
y
- - - - - -样本点的函数值
向量|矩阵|数组
样本点上的函数值,指定为数值向量、矩阵或数组。x
而且y
长度必须相同。
如果y
是一个矩阵或数组,那么最后一个维度的值,y(::,…,j)
,作为要匹配的值x
.在这种情况下,最后一个维度y
长度一定和x
.
数据类型:单
|双
xq
- - - - - -查询点
标量|向量|矩阵|数组
查询点,指定为标量、向量、矩阵或数组。在xq
是x插值函数值的坐标yq
计算makima
.
数据类型:单
|双
输出参数
yq
-查询点的插值值
标量|向量|矩阵|数组
查询点上的插值值,作为标量、向量、矩阵或数组返回。的大小yq
的大小有关吗y
而且xq
:
如果
y
是向量吗yq
尺寸和xq
.如果
y
数组的大小纽约=大小(y)
,则适用以下条件:如果
xq
那么是标量还是向量呢大小(yq)
返回纽约(1:end-1)长度(xq)]
.如果
xq
是数组吗大小(yq)
返回纽约(1:end-1)大小(xq)]
.
页
——分段多项式
结构
分段多项式,作为结构返回。将此结构与ppval
函数在一个或多个查询点上计算插值多项式。这个结构有这些字段。
场 | 描述 |
---|---|
形式 |
|
休息时间 |
向量的长度 |
系数 |
|
块 |
数量的碎片, |
订单 |
多项式的阶 |
昏暗的 |
维度的目标 |
因为多项式系数系数
如果是每个区间的局部系数,则必须减去对应的结区间的端点才能使用传统多项式方程中的系数。换句话说,对于系数(a, b, c, d)
的时间间隔(x1, x2)
,对应的多项式为
更多关于
修改Akima插值
的Akima算法对于一维插值,描述在[1]而且[2],进行三次插值,生成具有连续一阶导数的分段多项式(C1)。该算法避免了过多的局部波动。
如果 在区间上的斜率是多少 即导数的值 在采样点 为附近斜坡的加权平均值:
在Akima的原始公式中,权重为:
原始的Akima算法赋予两边的点同等的权重,均匀地划分一个波动。
当两个坡度不同的平坦区域相遇时,对原Akima算法的修改使坡度接近于零的一侧获得更多的权重。这种修改优先考虑更接近水平的一侧,更直观,避免超调。特别是,当有三个或更多连续共线点时,算法用一条直线连接它们,从而避免了超调。
改进后的Akima算法中使用的权重为:
相比样条
算法中,Akima算法产生的波动较少,更适合处理平面区域之间的快速变化。相比pchip
算法,Akima算法没有侵略性的平坦化,因此仍然能够处理振荡数据。
参考文献
[1] Akima,藤原浩。“一种基于局部过程的插值和平滑曲线拟合新方法。”美国计算机学会学报(JACM), 1970, pp. 589-602。
[2] Akima,藤原浩。一种基于局部过程的二元插值和光滑曲面拟合方法。ACM通信, 17.1, 1974,第18-20页。
扩展功能
C / c++代码生成
使用MATLAB®Coder™生成C和c++代码。
使用注意事项和限制:
输入
x
必须严格增加。代码生成不会删除
y
条目南
值。方法生成的代码
页= makima (x, y)
语法,那么你就不能输入页
到ppval
在MATLAB函数®.创建一个MATLAB页
结构从页
由代码生成器创建的结构:在代码生成中,使用
unmkpp
将分段多项式的细节返回到MATLAB中。在MATLAB中,使用
mkpp
创建页
结构。
如果你提供
xq
,如果y
具有可变大小且不是可变长度的向量,则生成的代码中向量输出的方向可能与MATLAB中的方向不匹配。
线程环境
在后台使用MATLAB®运行代码backgroundPool
或使用并行计算工具箱™加速代码ThreadPool
.
这个函数完全支持基于线程的环境。有关更多信息,请参见在线程环境中运行MATLAB函数.
GPU数组
通过使用并行计算工具箱™在图形处理单元(GPU)上运行来加速代码。
该功能完全支持GPU阵列。有关更多信息,请参见在图形处理器上运行MATLAB函数(并行计算工具箱).
分布式阵列
使用并行计算工具箱™跨集群的组合内存分区大型数组。
版本历史
介绍了R2019b
MATLAB命令
你点击了一个对应于这个MATLAB命令的链接:
在MATLAB命令窗口中输入命令来运行该命令。Web浏览器不支持MATLAB命令。
您也可以从以下列表中选择网站:
如何获得最佳的网站性能
选择中国网站(中文或英文)以获得最佳的网站表现。其他MathWorks国家网站没有针对从您的位置访问进行优化。