圆周率 π 的近似求法
这只是个单纯的数学问题
在我看来计算机只能进行机械运算,不知变通.其所认识的只有数字的数值大小.对面积,长度,等现实事务并无概念.所以,当我们在用计算机进行圆周率求解时,需将各种概念进行参数化,用数值计算来进行近似求解.
下面是我给出的圆周率求解模型
我们都知道圆的面积公式为 S= πr²
正方形的面积公式为 S = a²
我们取单位长度1 为圆的半径和正方形边长,取第一象限画出图形
其中正方形面积为 S = 1 ;
扇形面积为 S = π/4 ;
则扇形和正方形的面积比为 π/4
由此我们可以近似计算出圆周率 π 的值.
求解方法
在这种模型下求解方法有很多,我选择的是微元法.
我们可以将这个正方形进行分割,比如 在 x 轴放向上平均分成 100 份,在 y 轴放向上也平均分成 100 份,这样整个图形就被分成了 100x100=10000 份
由于每个单元都比较小,这里我们假设每个单元的面积全都集中在单元方格的中心,然后开始找出在扇形内的单元个数,就能近似求出扇形面积,从而计算出 圆周率 π = 4 * S ;
这种算法对于单元的划分越细最后求出的结果越精确,当单元划分无限大时,求出的结果应该为准确值 π ,但这种情况好像不会发生(哈哈)
实现代码
public static void main(String[] args) {
System.out.println("请输入你想划分的网格数:");
Scanner sc = new Scanner(System.in);
//获取每条边被分成多少格
int num = sc.nextInt();
//声明扇形中所有单元格个数
int sum = 0;
for (int x = 0; x < num; x++) {
for(int y = 0; y < num; y++){
double newX = (2*x+1)*1.0/(2*num);
double newY = (2*y+1)*1.0/(2*num);
//判断该节点是否在扇形中
if((newX*newX+newY*newY)<=1){
sum ++;
}else{
break;
}
}
}
//通过扇形中单元个数和总单元个数的比值来确定 圆周率 π 的大小
System.out.println("圆周率π的大小为 π = "+ (sum*4*1.0/(num*num)));
}