【基础算法】圆周率的多种方法求算 & C++实现

简介: 一个圆如下面左图所示,其半径为1,其内部内接一个正六边形。设正六边形的边长为y1。由几何知识可得知y1=1,所以圆的周长可近似为正六边形的周长C=6×y1=6.所以圆周率为前面的近似圆周长与圆直径之比,即C/2= 3≈π,这就是按照割圆法来得到圆周率近似值的方法。

割圆法


       一个圆如下面左图所示,其半径为1,其内部内接一个正六边形。设正六边形的边长为y1。由几何知识可得知y1=1,所以圆的周长可近似为正六边形的周长C=6×y1=6.所以圆周率为前面的近似圆周长与圆直径之比,即C/2= 3≈π,这就是按照割圆法来得到圆周率近似值的方法。

44f2dc372a0653e98cf97c8a2a561910_beacb1eb43f84150b1ae6f902b4f1eaa.png


分析:(上面右图所示)


其中边长为m、y1、y2的三条边构成一个小直角三角形,根据勾股定理可得:

e8f47f7a8e8cebe093b7476575fb6caf_f7aeee6bd93a4fe1adc4dd9ad0a54f33.png

其中边长为n,y1,1的三条边构成一个较大的三角形,根据勾股定理可得:

e743cf7f5dabcde54406b677e9924140_77c6206857b4465f9e8689e946609187.png

结合条件图中已知条件(m+n=1)和几何关系对公式继续进行化简推导:

0d57ea096ade10876552273249d07be1_63bbc6d1bfa9440aaedd7e24f34d08df.png

所以圆周率π的近似值为:

91b58ba88e40563855ddce28ee00d7cf_5b0a7c5d763a4c769e4e5dd47defb9b7.png

如果内接24边形,其边长为y3,则其圆周率为:

dfe1a6a0bb8bd7c4ed9c5c055196b645_538746e2ee2d4dc7916eccd82c441982.png

如果内接48边形,其边长为y4,则其圆周率为:

d7b2b0d3fb451d05fe333f03859a3c63_dd851708b8fa4a33ba1dae8fb65e641c.png

……


综上归纳可知,在割圆术这个算法中主要用到以下两个公式:

7d2589ff462843fefe55a37064443739_ca21c3301e844760b4c680f04bf3325f.png

#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
class cyclotomic {
public:
  void cyclotomic1()
  {
  int i = 1,a=1;
  double len = 1;
  while(i<=n)
  { 
    len = 2 - sqrt(4 - len);   //内接多边形的边长
    a *= 2;
    i++;
  }
  pi = 3.0 * (double)a * sqrt(len);
  }
  void showresult()
  {
  cout.precision(12);   //小数点后第十二位
  cout << pi << endl;
  }
  int n;
  double pi;
};
void text()
{
  cyclotomic c;
  cout << "输入要切割的次数:" << endl;
  cin>>c.n;
  c.cyclotomic1();
  c.showresult();
}
int main()
{
  text();
}

cb98cecf344f590c5a9463b8e99d1e20_be8e316b599a4f0ba5f4af0a2537c3af.png


●级数公式法


       在微积分中,对一个表达式进行级数展开并取极限便可以得到一系列的迭代计算公式。对于圆周率π也可以采用相同的方法来得到级数公式(泰勒展开式)。这样的级数公式很多,依赖于不同的级数展开表达式,下面就是一个典型的求圆周率级数公式的例子:

719cec5ac1c321ae59b447f55b05ea02_e95f95de906d405e9477f358aa92dca0.png

c12d0e7692a9ed5cb291a3adadfd1907_b26273be30354e5b85a71c9add462eb0.png

#include<iostream>
#include<iomanip>
using namespace std;
class series1 {
public:
  void series_1()
  {
  int i = 1;
  double sum=1,record=1, m=1, n=3,t;
  while (i <= x)
  {
    t = m / n;
    t = t * record;
    sum += t;
    m += 1;
    n += 2;
    record = t;
    i++;
  }
  pi = 2.0 * sum;
  }
  void showresult()
  {
  cout.precision(12);//小数点后第十二位
  cout << pi << endl;
  }
  int x;
  double pi;
};
void text()
{
  series1 s1;
  cout << "请输入该公式往后计算的位数:" << endl;
  cin >> s1.x;
  s1.series_1();
  s1.showresult();
}
int main()
{
  text();
}

13aed22994c3f3a3d443dae9815bce5a_187b1a10f6204b14b8894ad2e2066967.png

●格雷戈里公式法


       格雷戈里公式的实质是反正切函数的泰勒展开式,属于级数公式的一种,具体公式如下:

db2af17fc1173062995ff1e8c70be997_6a93e135c7e642ce8de179a6339749de.png


0c73c17261a740f56c2e14793f302263_2d74b3ac110d429d9bfb71d5891287b6.png

#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
class Gregory {
public:
  void Gregory1()
  {
  int sign = 1;
  double m = 1, term = 1;
  while (fabs(term) >= x)
  {
    pi += term;
    m += 2;
    sign = -sign; 
    term = sign / m;
  }
  pi = 4.0 * pi;
  }
  void showresult()
  {
  cout.precision(12);//小数点后第十二位
  cout << pi << endl;
  }
  double x;
  double pi=0;
};
void text()
{
  Gregory g;
  cout << "输入精度e的值:" <<endl;
  cin >> g.x;
  g.Gregory1();
  g.showresult();
}
int main()
{
  text();
}

816e0706e90bc0b802069e7387f7c2fb_8c61c961071c41e891dc588fd5551578.png

●蒙特卡洛


       在概率算法的文章中,举的蒙特卡洛算法例子就是用概率的方法去寻找π,具体在http://t.csdn.cn/VifFM


目录
相关文章
|
3月前
|
存储 编解码 算法
【多光谱滤波器阵列设计的最优球体填充】使用MSFA设计方法进行各种重建算法时,图像质量可以提高至多2 dB,并在光谱相似性方面实现了显著提升(Matlab代码实现)
【多光谱滤波器阵列设计的最优球体填充】使用MSFA设计方法进行各种重建算法时,图像质量可以提高至多2 dB,并在光谱相似性方面实现了显著提升(Matlab代码实现)
149 6
|
3月前
|
机器学习/深度学习 算法 调度
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
354 0
|
4月前
|
机器学习/深度学习 数据采集 传感器
具有多种最大功率点跟踪(MPPT)方法的光伏发电系统(P&O-增量法-人工神经网络-模糊逻辑控制-粒子群优化)之使用粒子群算法的最大功率点追踪(MPPT)(Simulink仿真实现)
具有多种最大功率点跟踪(MPPT)方法的光伏发电系统(P&O-增量法-人工神经网络-模糊逻辑控制-粒子群优化)之使用粒子群算法的最大功率点追踪(MPPT)(Simulink仿真实现)
328 0
|
2月前
|
机器学习/深度学习 数据采集 负载均衡
结合多种启发式解码方法的混合多目标进化算法,用于解决带工人约束的混合流水车间调度问题(Matlab代码实现)
结合多种启发式解码方法的混合多目标进化算法,用于解决带工人约束的混合流水车间调度问题(Matlab代码实现)
145 0
|
7月前
|
存储 监控 算法
基于 C++ 哈希表算法实现局域网监控电脑屏幕的数据加速机制研究
企业网络安全与办公管理需求日益复杂的学术语境下,局域网监控电脑屏幕作为保障信息安全、规范员工操作的重要手段,已然成为网络安全领域的关键研究对象。其作用类似网络空间中的 “电子眼”,实时捕获每台电脑屏幕上的操作动态。然而,面对海量监控数据,实现高效数据存储与快速检索,已成为提升监控系统性能的核心挑战。本文聚焦于 C++ 语言中的哈希表算法,深入探究其如何成为局域网监控电脑屏幕数据处理的 “加速引擎”,并通过详尽的代码示例,展现其强大功能与应用价值。
167 2
|
2月前
|
机器学习/深度学习 算法 物联网
基于遗传方法的动态多目标优化算法
基于遗传方法的动态多目标优化算法
|
9月前
|
存储 负载均衡 算法
基于 C++ 语言的迪杰斯特拉算法在局域网计算机管理中的应用剖析
在局域网计算机管理中,迪杰斯特拉算法用于优化网络路径、分配资源和定位故障节点,确保高效稳定的网络环境。该算法通过计算最短路径,提升数据传输速率与稳定性,实现负载均衡并快速排除故障。C++代码示例展示了其在网络模拟中的应用,为企业信息化建设提供有力支持。
267 15
|
9月前
|
存储 算法 数据处理
公司局域网管理中的哈希表查找优化 C++ 算法探究
在数字化办公环境中,公司局域网管理至关重要。哈希表作为一种高效的数据结构,通过哈希函数将关键值(如IP地址、账号)映射到数组索引,实现快速的插入、删除与查找操作。例如,在员工登录验证和设备信息管理中,哈希表能显著提升效率,避免传统线性查找的低效问题。本文以C++为例,展示了哈希表在局域网管理中的具体应用,包括设备MAC地址与IP分配的存储与查询,并探讨了优化哈希函数和扩容策略,确保网络管理高效准确。
|
5月前
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
157 0
|
7月前
|
监控 算法 数据处理
基于 C++ 的 KD 树算法在监控局域网屏幕中的理论剖析与工程实践研究
本文探讨了KD树在局域网屏幕监控中的应用,通过C++实现其构建与查询功能,显著提升多维数据处理效率。KD树作为一种二叉空间划分结构,适用于屏幕图像特征匹配、异常画面检测及数据压缩传输优化等场景。相比传统方法,基于KD树的方案检索效率提升2-3个数量级,但高维数据退化和动态更新等问题仍需进一步研究。未来可通过融合其他数据结构、引入深度学习及开发增量式更新算法等方式优化性能。
193 17