[英]Interpolating scattered 3D electric field data
我以以下形式的三个维度测量了电场数据:
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需要范数作为输入,并且生成的函数仅返回范数。 关于使用什么功能或如何解决此问题的任何建议?
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)));
如果在这个字段中独立地插值每个笛卡尔分量并不能维持矢量分量之间的某种关系,那么您可能需要一个不同的数值方法-也许在采用相同插值方法之前需要一些坐标转换-但这可能是数学上的一个问题堆栈交换站点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.