Объем тела методом Монте-Карло в С++

В прикладных расчетах методы Монте-Карло применяются достаточно часто. Причем нередко соответствующие методы исследования являются единственно возможными. В данном случае не будем останавливаться на особенностях методов Монте-Карло, ограничимся лишь некоторыми прак­тическими рецептами их использования, в частности, при вычислении объ­емов (площадей) тел. Предположим, необходимо вычислить объем тела (области пространства), форма которой достаточно сложна для того, чтобы это сделать аналитиче­ски. В этом случае тело, объем которого нужно вычислить, условно и це­ликом помещается внутрь другого тела, объем которого известен или легко вычисляется - например, квадрат или сферу. Далее случайным образом внутри этого внешнего тела выбираются точки и вычисляется отношение' точек, которые попали внутрь меньшего тела (объем которого вычисляет­ся) к общему числу точек. Если общее число точек стремится к бесконечности, то указанное отношение стремится к отношению объемов внутреннего и внешнего тел. На практике вместо случайного выбора точек используют сетку из равномерно распределенных точек. В этом случае говорят о квази-методах Монте-Карло. В примере ниже вычисляется объем усеченного конуса, накрытого полусферой. Объем такого тела вычисляется по формуле:
$$V=\frac{1}{3}\pi R^{2}H+\frac{2}{3}\pi R^{3}$$
где R-радиус, а H-высота усеченного конуса.
#include 
#include 
using namespace std;
int main(){
//Число pi:
const double pi=3.1415;
//Рабочие переменные программы:
double R,H,V,V0,x,y,z;
//Число точек N (по каждой из координат) 
//и число внутренних точек n:
int N=1500,n=0;
//Ввод параметров R и H:
cout << "Enter R = ";
cin >> R;
cout << "Enter H = ";
cin >> H;
//Объем параллелепипеда:
V0=4*R*R*(H+R);
//Перебор всех точек:
for(int i=0;i <= N;i++){
 x=2*i*R/N-R;
 for(int j=0;j <= N;j++){
 y=2*j*R/N-R;
 for(int k=0;k <= N;k++){
 z=k*(H+R)/N;
 //Подсчет внутренних точек:
 if(((sqrt(x*x+y*y)/R <= z/H)&&(z <= H))||((x*x+y*y+(z-H)
*(z-H) <= R*R)&&(z > H)))
 n++;
 }
 }
}
//Объем тела:
V=V0*n/pow(N+1,3);
//Вывод вычисленного и точного значений:
cout << "V = " << V << " : " << pi*R*R*H/3+2*pi*pow(R,3)/3 << endl;
return 0;
}
Онлайн всего: 4
Гостей: 4
Пользователей: 0

STUDLAB Сообщить про опечатку на сайте