計算陰影部分面積。
一個古人要求一個圖形的面積,他把圖形畫在一塊方形布上,然後找來一袋豆子,然後將所有豆子灑在布上,落在圖形內豆子的重量比上那塊布上所有豆子的重量再乘以布的面積就是他所要求的圖形的面積。 兩種編程思路來計算這個面積:
方法一:將整個座標軸看成一個邊長爲12的正方形,然後均勻的這個正方形分成N(N的大小取決於劃分的步長)個點,然後找出N個點中有多少個點是屬於陰影部分中,假設這個值爲k,則陰影部分的面積爲:k/N12^2
方法二:將整個座標軸看成一個邊長爲12的正方形,然後在(-6,6)中隨機出N(N越大越好,至少超過1000)個點,然後找出這N個點中有多少個點在陰 影區域內,假設這個值爲k,則陰影部分的面積爲:k/N12^2。然後重複這個過程100次,求出100次面積計算結果的均值,這個均值爲陰影部分面積。
對比分析:以上兩個方法都是利用蒙特卡羅方法計算陰影部分面積,只是在處理的細節有一點區別。前者是把豆子均勻分佈在布上;後者則是隨機把豆子仍在布上。就計算結果的精度而言,前者取決點的分割是否夠密,即N是否夠大;後者不僅僅通過N來控制精度,因爲隨機的因素會造成單次計算結果偏高和偏小,所以進行反覆多次計算最後以均值來衡量陰影部分面積。
C語言實現:
#include <stdio.h>
#include <stdlib.h>
#include <time.h> int n=100000000;
int main()
{
int test=n,i,total=0;
double s=0,func1,func2,func3,a,b,x,y;
srand(time(NULL)); //選取當前時間作爲隨機數種子
for (i=1;i<=test;i++)
{
x=((double)rand()/RAND_MAX-0.5)*12;
y=((double)rand()/RAND_MAX-0.5)*12; //生成兩個不同的隨機實數
func1=x*x/9+y*y/36-1;
func2=x*x/36+y*y-1;
func3=(x-2)*(x-2)+(y+1)*(y+1)-9;
if ((func1<0)&&(func2<0)&&(func3<0)) total=total+1;
}
a=total;b=test;
s=a*144/b;
printf("%.4f",s);
return 0;
}
MATLAB實現:
方法一:
clear
x=-6:0.01:6;
y=x;
s=size(x);
zs=s(1,2)^2;
k=0;
for i=1:s(1,2)
for j=1:s(1,2)
a1=(x(i)^2)/9+(y(j)^2)/36;
a2=(x(i)^2)/36+y(j)^2;
a3=(x(i)-2)^2+(y(j)+1)^2;
if a1<1
if a2<1
if a3<9
k=k+1;
end
end
end
end
end
mj=(12^2)*k/zs
運行結果: mj = 7.2150
方法二:
clear
N=10000;
n=100;
for j=1:n
k=0;
for i=1:N
a=12*rand(1,2)-6;
x(i)=a(1,1);
y(i)=a(1,2);
a1=(x(i)^2)/9+(y(i)^2)/36;
a2=(x(i)^2)/36+y(i)^2;
a3=(x(i)-2)^2+(y(i)+1)^2;
if a1<1
if a2<1
if a3<9 k=k+1;
end
end
end
end
m(j)=(12^2)*k/N;
end
mj=mean(m)
運行結果: mj = 7.2500