函数 "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
是常量,不依赖于 x
、y
或 z
.此函数的三重积分相当于计算积分区域的体积 (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 个输入(x
和y
)。在计算 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
是常数(即对于给定的 x
和 y
,无论 z
),它总是 returns 相同的值。因此,如果您要在 z
维度上执行第三次积分,它将与将结果乘以积分范围相同:
>> V*15
ans =
467.6537 % Same result you got from triplequad
我正在尝试使用 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);
给出的图如下图所示:
我认为您可能误解了问题的维度。您正在处理 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
是常量,不依赖于 x
、y
或 z
.此函数的三重积分相当于计算积分区域的体积 (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 个输入(x
和y
)。在计算 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
是常数(即对于给定的 x
和 y
,无论 z
),它总是 returns 相同的值。因此,如果您要在 z
维度上执行第三次积分,它将与将结果乘以积分范围相同:
>> V*15
ans =
467.6537 % Same result you got from triplequad