函数 "triplequad" 没有 return 正确的音量 (Octave/Matlab)

The function "triplequad" doesn't return the right volume (Octave/Matlab)

我正在尝试使用 Octave 获取配置文件下的音量。我为此建立了一个简单的模型:

function F1 = f_x(x)
  F1 = x-1;
endfunction

function F2 = f_y(y)
  F2 = y;
endfunction

function F3 = f_z(z)
  F3 = z;
endfunction

f_xyz = inline('f_x(x).*f_y(y).*f_z(z);', 'x', 'y', 'z');
Volume = triplequad(f_xyz,0,3,0,3,0,4)

x = 1:1:2;
y = 1:1:2;
z = 1:1:2;

f_plot=f_x(x).*f_y(y).*f_z(z)';

%Lines for plotting the 3D plot    
tx = linspace (0, 3, numel(x))';
ty = linspace (0, 3, numel(y))';
[xx, yy] = meshgrid (tx, ty);
tz = f_plot;
mesh (tx, ty, tz);

给出的图如下图所示: 我正在使用 triplequad 函数(它也适用于 Matlab)来获取该配置文件下的音量,但它看起来并不适用。函数 return 体积为 54 个单位,这不是真的。使用完整尺寸计算平行六面体的体积得到 36 个单位 (3 x 3 x 4),这证明它计算错误。问题是......我在这里做错了什么?为什么 "triplequad" 没有给出正确的音量?

我认为您可能误解了问题的维度。您正在处理 4D 函数:

f = @(x, y, z) (x-1).*y.*z;

您有一个由 f 返回的值(即因变量),该值由一组 3 个自变量确定,因此是一个 4D 函数。您必须根据 hypervolume instead of volume in this case, since volume is a 3D measurement. The triplequad 函数来计算 f 在自变量的一组给定范围内的三重积分,从而为您提供超体积:

>> triplequad(f, 0, 3, 0, 3, 0, 4)  % Integrate over 0 <= x <= 3, 0 <= y <= 3, 0 <= z <= 4

ans =

  53.999999999999986  % Just shy of 54

您的 3D 表面可视化没有任何意义,并且让您误入歧途,认为结果是错误的。


注意 1: 在 MATLAB 中,函数 triplequad appears slated for deprecation in a future release, so you should use integral3 代替。它似乎也能提供更准确的结果:

>> integral3(f, 0, 3, 0, 3, 0, 4)

ans =

    54


注意 2: 关于您的评论,函数 f(x,y,z) = 1 是常量,不依赖于 xyz.此函数的三重积分相当于计算积分区域的体积 (3*3*4 = 36) 乘以常数函数值(在本例中仅为 1)。您可以这样确认:

>> f = @(x, y, z) ones(size(x));
>> triplequad(f, 0, 3, 0, 3, 0, 4)

ans =

    36


编辑: 关于你的 follow-up 问题,我在尝试 运行 R2016b 中的那个例子时实际上遇到了错误,所以我不确定你是如何得到它的工作(尽管结果值是正确的):

>> V = triplequad(h_xxyy,0,3,0,3,0,15)
Error using inline/subsref (line 14)
Too many inputs to inline function.

问题是 triplequad 用于对 3 个变量的函数执行 三重 积分,但您的函数只有 2 个输入(xy)。在计算 2 个变量的函数下的体积时,您只需要对这 2 个变量进行积分,因此您应该在 Octave 中使用 MATLAB 函数 integral2 instead (or dblquad):

>> f = @(x, y) x.^2.*sqrt(y);
>> V = integral2(f, 0, 3, 0, 3)

V =

  31.176914536244894

请注意 f 没有 z 相关性,因此 f(x, y) 相对于 z 是常数(即对于给定的 xy,无论 z),它总是 returns 相同的值。因此,如果您要在 z 维度上执行第三次积分,它将与将结果乘以积分范围相同:

>> V*15

ans =

  467.6537  % Same result you got from triplequad