【问题标题】:Interpolate a scalar field over a 3D mesh refining the grid在细化网格的 3D 网格上插入标量场
【发布时间】:2017-12-13 10:30:36
【问题描述】:

我有函数 f=f(x,y,z) 在大小为 MxNxP 的点网格上进行数值计算。

我需要在(显然)不同维度的更精细网格上插入这些值。就像我对 interp1 所做的那样,当我在一个区间内只有一些函数值并且我想对其进行插值以找到更多点的值。

我尝试执行此代码:

XX=linspace(0,45,50);
YY=linspace(0,0.5,50);
ZZ=linspace(0,0.5,50);

U_1 = interp3(X,Y,Z,f,XX,YY,ZZ,'linear')

其中 X Y Z 是我具有 f 值的点的向量。 XX,YY,ZZ 是我想要解决的点。

我尝试使用 griddata 和 interp3,但收到以下错误消息:

使用 griddedInterpolant 时出错
网格向量不定义与给定值匹配的点网格。
interp3 中的错误(第 133 行)
F = griddedInterpolant({X, Y, Z}, V, method,extrap);

你能帮帮我吗?

【问题讨论】:

  • 使用 griddedInterpolant 时出错 网格向量未定义与给定值匹配的点网格。 interp3 中的错误(第 133 行) F = griddedInterpolant({X, Y, Z}, V, method,extrap);
  • 对于函数interp3,您需要使用由meshgrid 生成的混合方向向量或矩阵。请参阅文档和/或提供有关 f、X、Y 和 Z 数据格式的更多数据
  • f 是表示通道中流速的函数。通道的尺寸是 40x0.5x0.5,我有函数 f 在 X、Y、Z 中的值。我试着做 [XX,YY,ZZ] = meshgrid(0:hx:45,0:hy :0.5,0:hz:0.5) 但它不起作用。错误还是一样

标签: matlab interpolation


【解决方案1】:

您似乎有一个不规则的网格数据集。在这种情况下,您需要使用griddata() 函数进行插值。

请注意您定义的点数组 X、Y、Z 具有相同的维度。插值点数组 XX,YY,ZZ 也必须具有相同的维度。 这意味着以下表达式必须是true(或1):

all(size(X)==size(Y)) && all(size(X)==size(Z)))

为了创建插值,您可以使用 meshgrid。将插值网格的范围调整到实际数据范围是明智的:

[XX,YY,ZZ]=meshgrid(linspace(min(X(:)),max(X(:)),50), ...
                    linspace(min(Y(:)),max(Y(:)),50), ...
                    linspace(min(Z(:)),max(Z(:)),50));

这可能会得到您期望的结果。

【讨论】:

  • 使用 griddata 我得到的错误如下: Error using dedicatedInterpolant 数据点坐标尺寸不一致。 griddata>useScatteredInterp 中的错误(第 189 行) F = 分散的Interpolant(inargs{1}(:),inargs{2}(:),inargs{3}(:), ... griddata 中的错误(第 126 行)vq = useScatteredInterp (inputargs, numarg, method, 'none'); PS:我用mesh grid生成XX,YY,ZZ
  • X Y 和 Z 呢?
  • 它们表示计算 f 的原始网格的单元格的中心。它们是 x、y 和 z 位置的 3 个数组。位置之间的空间不是同质的。显然它们的尺寸是 M、N 和 P。
  • 抱歉,Georg 但 X、Y、Z 的尺寸不同,我该如何处理它们具有不同尺寸的事实?
  • X,Y,Z 是定义函数 f 的空间点。如果它们的尺寸不同,它们就不是点坐标列表,而是其他东西。对于每个 X,必须有一个对应的 Y 和 Z 值。如果不是这种情况,你应该如何计算 f(X,Y,Z)?
猜你喜欢
  • 1970-01-01
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 2017-05-07
  • 2023-03-28
相关资源
最近更新 更多