# griddedInterpolant
网格数据插值
函数库: TyMath
# 说明
使用 griddedInterpolant 对一维、二维、三维或 N 维网格数据集进行插值。griddedInterpolant 返回给定数据集的插值 F。您可以计算一组查询点(例如二维 (xq,yq))处的 F 值,以得出插入的值 vq = F(xq,yq)。
使用 scatteredInterpolant 执行散点数据插值。
# 创建对象
# 语法
F = griddedInterpolant()
F = griddedInterpolant(x,v)
F = griddedInterpolant(X1,X2,...,Xn,V)
F = griddedInterpolant(V)
F = griddedInterpolant(gridVecs,V)
F = griddedInterpolant(___,Method)
F = griddedInterpolant(___,Method,ExtrapolationMethod)
# 说明
F = griddedInterpolant() 创建一个空的网格数据插值对象。
F = griddedInterpolant(x,v) 根据样本点向量 x 和对应的值 v 创建一维插值。示例
F = griddedInterpolant(X1,X2,...,Xn,V) 使用作为一组 n 维数组 X1,X2,...,Xn 传递的样本点的完整网格创建二维、三维或 N 维插值。V 数组包含与 X1,X2,...,Xn 中的点位置关联的样本值。每个数组 X1,X2,...,Xn 的大小都必须与 V 相同。示例
F = griddedInterpolant(V) 使用默认网格创建插值。使用此语法时,griddedInterpolant 将网格定义为第 i 维上间距为 1 且范围为 [1, size(V,i)] 的点集。如果您希望节省内存且不在意点之间的绝对距离,则可使用此语法。示例
F = griddedInterpolant(gridVecs,V) 指定一个数组 gridVecs,它包含 n 个网格向量,描述一个 n 维样本点网格。在您要使用特定网格而且希望节省内存时可使用此语法。示例
F = griddedInterpolant(___,Method) 指定插值方法:"linear"、"nearest"、"next"、"previous"、"pchip"、"cubic"、"makima" 或 "spline"。您可以在上述任意语法中指定 Method 作为最后一个输入参数。示例
F = griddedInterpolant(___,Method,ExtrapolationMethod) 指定内插和外插方法。当您的查询点位于样本点域之外时,griddedInterpolant 使用 ExtrapolationMethod 估计值。示例
# 输入参数
x - 样本点向量
样本点,指定为向量。x 和 v 的大小必须相同。x 中的样本点必须唯一。
数据类型: Int | Float
v - 样本值向量 | 矩阵 | 多维数组
样本值,指定为向量、矩阵或多维数组。v 的元素是对应于 x 中的样本点的值。
要使用一组值进行插值,则 x 和 v 必须为相同长度的向量。
要使用多组值进行插值,则 v 可以是与 x 相比具有额外维度的数组。v 的第一个维度的大小必须与 x 中的采样点数相匹配,并且 v 中的每列都定义一组单独的一维值。例如,如果 x 是一个包含 10 个元素的列向量,则可以将 v 指定为 10×4 矩阵以使用四组不同值进行插值。
数据类型: Int | Float
复数支持: 是
X1,X2,Xn - 完整网格形式的样本点数组
完整网格形式的样本点,指定为单独的 n 维数组。样本点必须唯一且有序。您可以使用 ndgrid 函数创建数组 X1,X2,...,Xn。这些数组的大小相同,且每个数组的大小与 V 相同。
数据类型: Int | Float
gridVecs - 网格向量形式的样本点网格向量元组
网格向量形式的样本点,指定为网格向量元组 (xg1,xg2,...,xgn)。样本点必须唯一且有序。这些向量必须指定大小与 V 相同的网格。换言之,size(V) = (length(xg1),length(xg2),...,length(xgn))。将此形式用作完整网络的替代方法以在您的网格非常大时节省内存。
数据类型: Int | Float
V - 样本值数组
样本值,指定为数组。V 的元素是对应于样本点的值。V 的前 N 个维度必须与采样点的完整网格中的对应维度具有相同的大小,其中 N 是网格的维数。
要使用一组值进行插值,请将 V 指定为数组,其大小与采样点的完整网格相同。例如,如果采样点形成一个大小为 100×100 的网格,则可以用相同大小的矩阵来指定值。
要使用多组值进行插值,请将 V 指定为与采样点网格相比具有额外维度的数组。额外维度在每个采样点上定义多个值。例如,如果采样点形成一个大小为 100×100 的网格,则可以将值指定为一个 100×100×4 数组,以使用四组不同的 100×100 值进行插值。
数据类型: Int | Float
复数支持: 是
Method - 插值方法"linear"(默认) | "nearest" | "next" | "previous" | "pchip" | "cubic" | "spline" | "makima"
插值方法,指定为下表中的选项之一。
| 方法 | 说明 | 连续性 | 注释 |
|---|---|---|---|
| "linear"(默认值) | 线性插值。查询点处的插入值基于各维中邻近网格点处数值的线性插值。这是默认插值方法。 | C0 |
|
| "nearest" | 最近邻点插值。查询点处的插入值是距样本网格点最近的值。 | 不连续 |
|
| "next" | 下一个邻点插值(仅限于一维)。查询点处的插入值是下一个采样网格点的值。 | 不连续 |
|
| "previous" | 上一个邻点插值(仅限于一维)。查询点处的插入值是上一个采样网格点的值。 | 不连续 |
|
| "pchip" | 保形分段三次插值(仅限一维)。查询点处的插入值基于邻近网格点处数值的保形分段三次插值。 | C1 |
|
| "cubic" | 三次插值。查询点处的插入值基于各维中邻近网格点处数值的三次插值。插值基于三次卷积。 | C1 |
|
| "makima" | 修正 Akima 三次 Hermite 插值。查询点处的插入值基于次数最大为 3 的多项式的分段函数。为防过冲,已修正 Akima 公式。 | C1 |
|
| "spline" | 三次样条插值。查询点处的插入值基于各维中邻近网格点处数值的三次插值。插值基于使用非结终止条件的三次样条。 | C2 |
|
数据类型: String
ExtrapolationMethod - 外插方法"linear" | "nearest" | "next" | "previous" | "pchip" | "spline" | "makima" | 标量值
外插方法,指定为 "linear", "nearest", "next", "previous", "pchip", "spline", "makima" 或标量值。如果指定该值为标量值,则网格域之外的查询返回该标量值。
如果您省略 ExtrapolationMethod,则默认值是为 Method 指定的值。如果您同时省略 Method 和 ExtrapolationMethod 参数,则两个值均默认为 "linear"。
数据类型: Int | Float | String
复数支持: 是
# 属性
gridVectors - 网格向量元组
网格向量,指定为元组 (xg1,xg2,...,xgn)。这些向量为 values 中的值指定网格点(位置)。网格点必须唯一。
values - 样本点处的函数值数组
样本点处的函数值,指定为与 gridVectors 中的网格点关联的值数组。
method - 插值方法"linear"(默认) | "nearest" | "next" | "previous" | "pchip" | "cubic" | "spline" | "makima"
内插方法,指定为字符向量。Method 可以是:"linear"、"nearest"、"next"、"previous"、"pchip"、"cubic"、"spline" 或 "makima"。有关这些方法的说明,请参阅 Method。
extrapolationMethod - 外插方法"linear" | "nearest" | "next" | "previous" | "pchip" | "spline" | "makima" | 标量值
内插方法,指定为字符向量。extrapolationMethod 可以是:"linear"、"nearest"、"next"、"previous"、"pchip"、"cubic"、"spline"、"makima"或标量值。标量值的值为常值外插。默认值是 Method 的值。
# 用途
使用 griddedInterpolant 创建插值 F。然后,您可以使用以下任何语法在特定点处计算 F:
Vq = F(Xq)
Vq = F(xq1,xq2,...,xqn)
Vq = F(Xq1,Xq2,...,Xqn)
Vq = F((xgq1,xgq2,...,xgqn))
Vq = F(Xq) 在矩阵 Xq 中指定查询点。Xq 的每一行包含一个查询点的坐标。
Vq = F(xq1,xq2,...,xqn) 以列向量的形式指定查询点 xq1,xq2,...,xqn,列向量的长度为 m,表示分散在 n 维空间的 m 个点。
Vq = F(Xq1,Xq2,...,Xqn) 使用 n 维数组 Xq1,Xq2,...,Xqn 指定查询点,这些数组定义点的完整网格。
Vq = F((xgq1,xgq2,...,xgqn)) 将查询点指定为网格向量。使用此语法可在您要查询大型点网格时节省内存。
# 示例
一维插值
使用 griddedInterpolant 进行一维数据集插值。
创建一个由散点样本点组成的向量 v。这些点是在 0 到 20 之间的随机一维位置进行采样的点。
using TyMath
using TyPlot
rng = MersenneTwister(1234)
x = sort(20 .*rand(rng,100))
v = besselj.(0,x)
为数据创建网格插值对象。默认情况下,griddedInterpolant 使用 "linear" 插值方法。
F = griddedInterpolant(x,v)
查询 0 到 20 之间 500 个均匀间隔点处的插值 F。将插值结果 (xq,vq) 绘制在原始数据 (x,v) 之上。
xq = LinRange(0,20,500)
vq = F(xq)
plot(x,v,"ro")
hold("on")
plot(xq,vq,".")
legend(["Sample Points","Interpolated Values"])
在不指定样本点的情况下进行插值
使用这两种方法对三维数据插值以指定查询点。
创建并绘制一个三维数据集,表示函数
using TyMath
using TyBase
using TyPlot
x,y = ndgrid(-5:0.8:5,dims=2)
z = @. sin(x^2 + y^2) / (x^2 + y^2)
surf(x,y,z)
为数据创建网格插值对象。
F = griddedInterpolant(x,y,z)
使用更精细的网格查询插值并提高分辨率。
xq,yq = ndgrid(-5:0.1:5,dims=2)
vq = F(xq,yq)
surf(xq,yq,vq)
如果存在大量样本点或查询点,或者担心内存使用量太大,您可以使用网格向量来提高内存使用率。
如果您指定网格向量而不是使用 ndgrid 来创建完整网格,则 griddedInterpolant 可以避免为执行计算而生成完整的查询网格。
传递网格向量时,它们通常一组为单位,就像元组 (xg1, xg2, ..., xgn) 中的元一样。网格向量是表示完整网格数据点的紧凑方式。
也可以使用网格向量执行上述命令。
x = -5:0.8:5
z = zeros(length(x),length(x))
for i in CartesianIndices(z)
xp = x[i[1]]
yp = x[i[2]]
z[i] = sin(xp^2+yp^2)/(xp^2+yp^2)
end
F = griddedInterpolant((x,x),z)
xq = -5:0.1:5
vq = F((xq,xq))
surf(xq,xq,vq)
使用默认网格进行插值
使用默认网格对一组样本点执行快速插值。默认网格使用单一间距点,因此当样本点之间的精确 xy 间距不重要时,可以使用这种插值方法。
创建一个样本函数值矩阵,然后绘制它们对默认网格的图。
using TyMath
using TyBase
using TyPlot
x = 1:0.3:5
n = length(x)
V = zeros(n,n)
for i in CartesianIndices(V)
V[i] = cos(x[i[1]])*sin(x[i[2]])
end
surf(1:n,1:n,V)
使用默认网格插入数据。
F = griddedInterpolant(V)
查询插值并绘制结果。
xq,yq = ndgrid(1:0.2:n,dims=2)
Vq = F(xq,yq)
surf(xq',yq',Vq)
更精细的网格上的二维插值
使用间距为 0.5 的完整网格进行粗略取样的数据插值。
在两个维度中以完整网格形式定义范围为 [1, 10] 的样本点。
using TyMath
using TyBase
using TyPlot
X,Y = ndgrid(1:10,1:10)
在网格点处对
V = @. X^2 + Y^2
创建指定三次插值的插值。
F = griddedInterpolant(X,Y,V,"cubic")
使用 0.5 间距定义由查询点构成的完整网格并在这些点计算插值。然后,绘制结果。
Xq,Yq = ndgrid(1:0.5:10,1:0.5:10)
Vq = F(Xq,Yq)
mesh(Xq,Yq,Vq)
一维外插
使用 "pchip" 和 "nearest" 外插方法比较查询 F 的域外插值的结果。
创建插值,并指定 "pchip" 作为内插方法,"nearest" 作为外插方法。
using TyMath
using TyPlot
x = [1,2,3,4,5]
v = [12,16,31,10,6]
F = griddedInterpolant(x,v,"pchip","nearest")
查询插值,并包括 F 的域外部的点。
xq = 0:0.1:6
vq = F(xq)
figure()
plot(x,v,"o",xq,vq,"-b")
legend(["v","vq"])
再次查询相同点的插值,这次使用 pchip 外插方法。
F.extrapolationMethod = "pchip"
figure()
vq = F(xq)
plot(x,v,"o",xq,vq,"-b")
legend(["v","vq"])
为 x 域范围外的所有查询点指定常量值
使用 griddedInterpolant 在相同的查询点上进行三组不同值插值。
使用 −5≤X≤5 和 −3≤Y≤3 创建一个采样点网格。
using TyMath
using TyBase
using TyPlot
gx = -5:5
gy = -3:3
X,Y = ndgrid(gx,gy)
在查询点计算三个不同函数的值,然后将这些值串联成一个三维数组。V 的大小与前两个维度中的 X 和 Y 网格相同,但额外维度的大小反映与每个采样点相关联的值数目(在本例中为三个)。
f1 = @. X^2 + Y^2
f2 = @. X^3 + Y^3
f3 = @. X^4 + Y^4
V = cat(f1,f2,f3,dims=3)
使用采样点和相关联的值创建插值。
F = griddedInterpolant(X,Y,V)
创建一个查询点网格,其网格大小比采样点更细。
qx = -5:0.4:5
qy = -3:0.4:3
XQ,YQ = ndgrid(qx,qy)
在查询点对所有三组值进行插值。
VQ = F(XQ,YQ)
将原始数据与插值后的结果进行比较。
subplot(3, 2, 1)
surf(X, Y, f1)
title("f1")
subplot(3, 2, 2)
surf(XQ, YQ, VQ[:,:,1])
title("Interpolated f1")
subplot(3, 2, 3)
surf(X, Y, f2)
title("f2")
subplot(3, 2, 4)
surf(XQ, YQ, VQ[:,:,2])
title("Interpolated f2")
subplot(3, 2, 5)
surf(X, Y, f3)
title("f3")
subplot(3, 2, 6)
surf(XQ, YQ, VQ[:,:,3])
title("Interpolated f3")
tightlayout()
# 详细信息
插值
可在查询点计算的插值函数。
网格数据
一组轴对齐的有序点。
散点数据
在其相对位置没有结构体的一组点。
完整网格
表示为一组数组的网格。例如,您可以使用 ndgrid 创建完整网格。
网格向量
充当 ndgrid 格式的网格的紧凑表示形式的向量组。
例如,X,Y = ndgrid(xg,yg) 在矩阵 X 和 Y 中返回完整网格。您可以使用网格向量 xg 和 yg 表示同一网格。
# 提示
计算一个 griddedInterpolant 对象 F 在多组不同查询点处的插值比分别使用 interp1、interp2、interp3 或 interpn 计算插值更快。例如:
F = griddedInterpolant(X1,X2,V)
v1 = F(Xq1)
v2 = F(Xq2)
v1 = interp2(X1,X2,V,Xq1)
v2 = interp2(X1,X2,V,Xq2)
# 另请参阅
interp1 | interp2 | interp3 | interpn | ndgrid | meshgrid2 | meshgrid3 | fill!