试图计算锥体的体积

时间:2011-04-10 12:16:56

标签: matlab geometry

我正在尝试使用MATLAB程序来近似锥体的体积,该程序使用半径减小的n个相等光盘(圆柱体)。底部是最大的圆盘,下面是最上面的圆盘,顶部是半径最小的圆盘。我没有麻烦获得输入,但我无法弄清楚如何使用光盘计算音量。对于循环或while循环?

顺便说一下光盘的音量是pi * r * r * h,h是高度,r是半径

下一步,我需要计算所需的光盘数量,以便错误百分比小于1%

这是我到目前为止所写的全部内容,使用有限数量的光盘计算音量效果很好,但我无法弄清楚如何计算光盘数量以使误差百分比小于1%。我很感激帮助。谢谢!!

h=input('Enter height: ');
if (h<=0)
disp('Height must be positive!');
else
r=input('Enter base radius: ');
if (r<=0)
disp('Base radius must be positive!');
else
n=input('Enter number of discs: ');
ne=n;
  while n>0 || n~=0
             if n>0 && (mod(n,1))==0
                Vcone=(1/3)*(pi*r*r*h);
                VTotal=0;
                  for i=n:-1:1
                      rEachDisc=r*(((i-1)*h)/n)/h;
                      VEachDisc=(pi*rEachDisc*rEachDisc)*(h/n);
                      VTotal=VTotal+VEachDisc;                   
                  end
                Vapp=VTotal+((pi*r*r)*(h/n));
                eror=abs((Vcone-Vapp)/Vcone*100);
                fprintf('For n=%g, approximated volume: %g ; error:     %g%%\n',n,Vapp,eror)
             else
                disp('This is not a positive integer!');
             end
        n=input('Enter number of discs: ');
  end 
end
end
VTotal=0;
t=1;
Vcone=(1/3)*(pi*r*r*h);
for i=ne:-1:1
rEachDisc=r*(((i-1)*h)/ne)/h;
VEachDisc=(pi*rEachDisc*rEachDisc)*(h/ne);
VTotal=VTotal+VEachDisc; 
Vapp=VTotal+((pi*r*r)*(h/ne));
eror=abs((Vcone-Vapp)/Vcone*100);
if eror==1
fprintf('We need at least %g discs to approximate the volume with less than 1%%   error.',ne);
  break
end
end

3 个答案:

答案 0 :(得分:1)

以上答案,特别是yoda告诉你如何计算近似值。

至于检测到您达到1%错误的时间,有两个选项:

  • 与确切的公式V = pi/3 * r^2 * h比较,其中r是基本半径。由于这基本上不需要任何近似,这可能不是主意。
  • 考虑以下思想实验:
    • 如果你拍摄一堆包含整个圆锥的光盘(也就是说,最大的光盘应该以半径作为半径),则音量必须小于,而不是音量的总和光盘。
    • 如果您拍摄整个圆锥体中的一叠光盘(“将半径移动一步”),圆锥的体积必须> >光盘的体积总和
    • 因此,错误总是小于两个堆栈之间的差异。如果您使用第一个作为近似值,则误差小于最大光盘。

在代码中:

r = h*(1:n)/n;
V = pi * r.^2 * h / n;
V = sum(V);
e = V(1);
re = e/(V-e);

现在V包含对卷的估计,e包含绝对错误的上限,re包含相对错误的上限。

答案 1 :(得分:0)

使用for循环。

关键是要意识到锥体具有恒定的斜率,因此近似锥体中的每个圆盘将与半径中的最后一个圆盘的常数因子不同。 (或者等效地说,它与直径中的最后一个不同的是一个常数因子。它是一样的。)

要计算每张光盘的半径,您需要从前一个半径中减去一个固定数字。所以每次循环你都需要修改半径变量r。

答案 2 :(得分:0)

如果你打破问题,你可以更简单地编程,而你根本不必使用任何循环。 MATLAB的优势在于数组/向量操作,你应该充分利用它。以下是您应该尝试的步骤:

  1. 首先,您需要将圆锥分割为N个部分。将高度作为向量从0处理为H,使用linspace函数将其划分为N个相等的段。
  2. 正如罗宾所说,坡度是恒定的。因此,找到此斜率(从高度H和基础半径R)并使用此高度向量,您可以获得半径半径向量,该向量给出每个磁盘的半径。
  3. 您知道如何计算单个磁盘的面积。在MATLAB中,您可以使用.前缀对数组中的所有元素执行算术运算。因此,例如,如果您要将向量x的所有元素都提升到某个幂n,则可以编写x.^n。从这里,您可以一步计算每个磁盘的面积。不需要循环。
  4. 使用sum添加磁盘区域。
  5. 最后要获得音量,您需要将此总面积乘以磁盘的厚度。这可以从高度向量轻松获得。
  6. 祝你好运。