我以以下形式的三个维度测量了电场数据:
pos = [x1 y1 z1
x2 y2 z2
. . .
x1000 y1000 z1000]
ef = [e_x1 e_y1 e_z1
e_x2 e_y2 e_z2
. . .
e_x1000 e_y1000 e_z1000]
位置位于半球形内。我希望能够在球体的某个点进行电场插值,以便获得电场分量的所有三个值,而不仅仅是整个电场的范数。由于点不在网格中,因此interp3不起作用。 splitInterpolant需要范数作为输入,并且生成的函数仅返回范数。关于使用什么功能或如何解决此问题的任何建议?
答案 0 :(得分:0)
scatteredInterpolant
一次只能插值一列样本,但是插值矢量场的一种方法是独立插值矢量的每个分量。
使用scatteredInterpolant
很简单。
componentInterpolants = cellfun(@(v) {scatteredInterpolant(pos,v)}, num2cell(ef,1));
这将为您提供三个scatteredInterpolant
对象的单元格数组,该字段对应于该字段的每个笛卡尔分量。通过针对指定坐标分别评估每个坐标并将结果相加,可以得到每个给定坐标的电场矢量。您可以定义一个便利函数,为给定的起点坐标完整地提供内插矢量场:
efInterpolant = @(coords) cell2mat(cellfun(@(interpolant) {interpolant(coords)}, componentInterpolants));
验证这是否准确地插值了原始矢量场(除非有浮点错误):
assert(all(all(abs(ef - efInterpolant(pos)) < eps * 2)));
如果独立地对每个笛卡尔分量进行插值并不能保持该字段中期望的矢量分量之间的某种关系,那么您可能需要一个不同的数值方法-可能需要采用相同的插值方法之前进行一些坐标转换-但这可能是一个更大的问题用于数学堆栈交换网站。