【问题标题】:Interpolating scattered 3D electric field data插值分散的 3D 电场数据
【发布时间】:2018-12-12 15:55:58
【问题描述】:

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

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

【问题讨论】:

  • griddata 可能是你想要的
  • 根据文档,该函数将样本值作为向量,而不是数组。所以我认为它也会使用规范?
  • “规范”是什么意思?另外,您是什么意思“向量,而不是数组”?有什么区别?
  • 你只需要griddata(pos(:,1),pos(:,2),pos(:,3),ef(:,1),yourpointsx,yourpointsy)
  • 对不起,我的意思是矩阵。范数是指向量的第二个范数。所以sqrt(e_x^2 + e_y^2 + e_z^2)。您的第二条评论是否计算了某个位置的电场的 x 分量?

标签: matlab


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-26
    • 2018-05-13
    • 2015-07-21
    • 2019-10-27
    • 2014-08-31
    • 2013-12-27
    • 2020-03-11
    • 2016-06-22
    相关资源
    最近更新 更多