027 实例6-圆周率的计算

目录

  • 一、"圆周率的计算"问题分析

    • 1.1 蒙特卡罗方法
  • 二、"圆周率的计算"实例讲解
    • 2.1 蒙特卡罗方法
  • 三、"圆周率的计算"举一反三
    • 3.1 理解方法思维
    • 3.2 程序运行时间分析
    • 3.3 计算问题的扩展

一、"圆周率的计算"问题分析

圆周率的近似计算公式

\[
\pi = \sum_{k=0}^\infty[\frac{1}{16^k}(\frac{4}{8k+1}-\frac{2}{8k+4}-\frac{1}{8k+5}-\frac{1}{8k+6})]
\]

1.1 蒙特卡罗方法

二、"圆周率的计算"实例讲解

圆周率的近似计算公式

\[
\pi = \sum_{k=0}^\infty[\frac{1}{16^k}(\frac{4}{8k+1}-\frac{2}{8k+4}-\frac{1}{8k+5}-\frac{1}{8k+6})]
\]

# CalPiV1.py

pi = 0
N = 10
for k in range(N):
    pi += 1 / pow(16, k) * (4 / (8 * k + 1) - 2 / (8 * k + 4) - 1 /
                            (8 * k + 5) - 1 / (8 * k + 6))
    print("圆周率值是: {}".format(pi))
圆周率值是: 3.1333333333333333
圆周率值是: 3.1414224664224664
圆周率值是: 3.1415873903465816
圆周率值是: 3.1415924575674357
圆周率值是: 3.1415926454603365
圆周率值是: 3.141592653228088
圆周率值是: 3.141592653572881
圆周率值是: 3.141592653588973
圆周率值是: 3.1415926535897523
圆周率值是: 3.1415926535897913

2.1 蒙特卡罗方法

# CalPiV2.py

from random import random
from time import perf_counter

DARTS = 1000 * 1000
hits = 0.0
start = perf_counter()

for i in range(1, DARTS + 1):
    x, y = random(), random()
    dist = pow(x**2 + y**2, 0.5)
    if dist <= 1.0:
        hits = hits + 1

pi = 4 * (hits / DARTS)
print("圆周率值是: {}".format(pi))
print("运行时间是: {:.5f}s".format(perf_counter() - start))
圆周率值是: 3.141148
运行时间是: 0.77535s

三、"圆周率的计算"举一反三

3.1 理解方法思维

  • 数学思维:找到公式,利用公式求解
  • 计算思维:抽象一种过程,用计算机自动化求解
  • 谁更准确? (不好说…)

3.2 程序运行时间分析

  • 使用time库的计时方法获得程序运行时间
  • 改变撒点数量,理解程序运行时间的分布
  • 初步掌握简单的程序性能分析方法

3.3 计算问题的扩展

  • 不求解圆周率,而是某个特定图形的面积
  • 在工程计算中寻找蒙特卡罗方法的应用场景

原文地址:https://www.cnblogs.com/nickchen121/p/11185034.html

时间: 2024-10-16 21:02:00

027 实例6-圆周率的计算的相关文章

圆周率的计算【random库的应用】

圆周率的计算 ????????????????????????????????????????????????????????????????????????????????????????????????描述???????????????????????????????????????????????????????????????????????????????????????????????? 求解圆周率可以采用蒙特卡罗方法,在一个正方形中撒点,根据在1/4圆内点的数量占总撒点数的比例计算

圆周率的计算No.1

一.安装tqdm库 1.利用cmd命令提示符,进入python所在的文件盘 2.输入 pip install tqdm 即可安装tqdm库 二.输入代码(已经整合进度条与圆周率的代码) from random import random from math import sqrt from time import * from tqdm import tqdm DARTS=10000000 hits=0.0 clock() for i in range(1,DARTS+1): x,y=rando

圆周率的计算

一.安装tqdm库 1.利用cmd命令提示符,进入python所在的文件盘 2.输入 pip install tqdm 即可安装tqdm库 二.输入代码(已经整合进度条与圆周率的代码) from random import random from math import sqrt from time import * from tqdm import tqdm DARTS=10000000 hits=0.0 clock() for i in range(1,DARTS+1): x,y=rando

Android Developer -- Bluetooth篇 开发实例之六 蓝牙RSSI计算距离

计算公式: d = 10^((abs(RSSI) - A) / (10 * n)) 其中: d - 计算所得距离 RSSI - 接收信号强度(负值) A - 发射端和接收端相隔1米时的信号强度 n - 环境衰减因子 计算公式的代码实现 - (float)calcDistByRSSI:(int)rssi { int iRssi = abs(rssi); float power = (iRssi-59)/(10*2.0); return pow(10, power); } 传入RSSI值,返回距离(

一起talk C栗子吧(第三十四回:C语言实例--巧用溢出计算最值)

各位看官们,大家好,上一回中咱们说的是巧用移位的例子,这一回咱们说的例子是:巧用溢出计算最值. 闲话休提,言归正转.让我们一起talk C栗子吧! 大家都知道,程序中的变量都有一个取值范围,这个范围也计算机和编译器都有关系.我们举个实际的例 子进行说明:在32位的计算机上,如果使用4个字节存储int类型的变量也就是说使用了32位的存储空间. 这时int类型变量的取值范围是:负2的32次方到正2的32次方-1,具体的数值是-2147483648到2147483647. 如果把不在这个范围内的数值赋

OpenMP并行化实例----Mandelbrot集合并行化计算

在理想情况下,编译器使用自动并行化能够管理一切事务,使用OpenMP指令的一个优点是将并行性和算法分离,阅读代码时候无需考虑并行化是如何实现的.当然for循环是可以并行化处理的天然材料,满足一些约束的for循环可以方便的使用OpenMP进行傻瓜化的并行. 为了使用自动并行化对Mandelbrot集合进行计算,必须对代码进行内联:书中首次使用自动并行化时候,通过性能分析发现工作在线程中并未平均分配. #include <stdio.h> #include <malloc.h> #de

第 5 章 Nova - 027 - 看 nova-scheduler 如何选择计算节点

nova-scheduler nova-scheduler 选择在哪个计算节点上启动 instance 创建 Instance 时,用户会提出资源需求,例如 CPU.内存.磁盘各需要多少. OpenStack 将这些需求定义在 flavor 中,用户只需要指定用哪个 flavor 就可以了. 可用的 flavor 在 Admin -> Compute -> Flavors 中管理. Flavor 主要定义了 VCPU,RAM,DISK 和 Metadata 这四类. nova-schedule

函数计算支持 MySQL 实例绑定

函数计算(Function Compute):函数计算 是事件驱动的全托管计算服务.使用函数计算,您无需采购与管理服务器等基础设施,只需编写并上传代码.函数计算为您准备好计算资源,弹性地可靠地运行任务,并提供日志查询.性能监控和报警等功能.借助函数计算,您可以快速构建任何类型的应用和服务,并且只需为任务实际消耗的资源付费. 背景 通过工单和客户群里面的反馈,我们发现存在大量用户问:"函数计算如何安全的访问某某资源".例如:函数计算如何安全的访问 RDS 资源等等诸如此类.尤其是 &qu

带有进度条的圆周率计算

圆周率的计算 计算公式:pi / 4=1 - 1/3 + 1/5 - 1/7 + 1/9 ...... 梅钦公式:pi /4 = 4arctan1/5 - arctan1/239 n=圆周长/直径 n=圆面积/半径平方 import math import time scale=10 print("执行开始") t=time.process_time() for i in range(scale+1): a,b='**'*i,'..'*(scale-i) c=(i/scale)*100