пытаясь рассчитать объем конуса - PullRequest
0 голосов
/ 10 апреля 2011

Я пытаюсь приблизить объем конуса с помощью программы 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 ]

1 голос
/ 11 апреля 2011

Ответы выше, особенно йода, расскажут вам, как вычислять приближения.

Что касается определения, когда вы достигли ошибки 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 верхнюю границу для относительной ошибки.

0 голосов
/ 10 апреля 2011

Программирование проще, если вы решаете проблему и вам не нужно использовать какие-либо циклы вообще.Сила MATLAB в манипулировании массивами / векторами, и вы должны в полной мере использовать это.Вот шаги, которые вы должны попробовать:

  1. Сначала вам нужно разделить конус на N части.Рассматривая высоту как вектор от 0 до H, используйте функцию linspace , чтобы разделить ее на N равные сегменты.
  2. Как уже упоминал Робин, наклон постоянен.Так что найдите этот уклон (от высоты H и базового радиуса R) и, используя это и вектор высоты, вы можете получить вектор радиуса радиуса, который дает радиус каждого диска.рассчитать площадь одного диска.В MATLAB вы можете выполнять арифметические операции со всеми элементами в массиве, используя префикс ..Так, например, если бы вы подняли все элементы вектора x до некоторой степени n, вы бы написали x.^n.Исходя из этого, вы можете рассчитать площадь каждого диска за один шаг.Никаких циклов не требуется.
  3. Используйте sum, чтобы сложить области диска.
  4. Наконец, чтобы получить том, вам нужно будет умножить эту общую площадьпо толщине диска.Это вы можете легко получить из вектора высоты.

Удачи.

0 голосов
/ 10 апреля 2011

Используйте цикл for.

Ключ в том, чтобы понять, что конус имеет постоянный наклон, поэтому каждый диск в вашем приближении конуса будет отличаться от последнего по радиусу на постоянный коэффициент. (Или, что эквивалентно, он будет отличаться от последнего в диаметре постоянным коэффициентом. Это то же самое.)

Чтобы рассчитать радиус каждого диска, вам необходимо вычесть фиксированное число из предыдущего радиуса. Таким образом, каждый раз, когда вам нужно выполнить цикл, вам нужно будет изменить переменную радиуса r.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...