首页 > 解决方案 > 插值分散的 3D 电场数据

问题描述

我测量了以下形式的三个维度的电场数据:

 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 将不起作用,因为这些点不在网格中。scatterInterpolant 需要范数作为输入,生成的函数只返回范数。关于使用什么功能或如何解决这个问题的任何建议?

标签: matlab

解决方案


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)));

如果独立插值每个笛卡尔分量不能保持您在该字段中期望的向量分量之间的某种关系,那么您可能需要一种不同的数值方法——也许在采用相同的插值方法之前进行一些坐标变换——但这可能更多是数学的问题堆栈交换站点。


推荐阅读