网站建设公司知名,云南网上工商办事大厅,福建亨利建设集团有限公司网站,义乌做网站zisou8文章目录1. π\piπ2. 用微积分来计算π\piπ2.1 原理2.2 代码2.3 结果2.4 分析1. π\piπ π\piπ的重要性或者地位不用多说#xff0c;有时候还是很好奇#xff0c;精确地π\piπ值是怎么计算出来的。研究π\piπ的精确计算应该是很多数学家计算机科学家努力的方向#xf…
文章目录1. π\piπ2. 用微积分来计算π\piπ2.1 原理2.2 代码2.3 结果2.4 分析1. π\piπ
π\piπ的重要性或者地位不用多说有时候还是很好奇精确地π\piπ值是怎么计算出来的。研究π\piπ的精确计算应该是很多数学家计算机科学家努力的方向很多算式看起来和π\piπ没有一点关系但是最后的表达式中却包含π\piπ。 作为一个国家定义的从事信息技术的“新时代农民工”要验证某些式子相对来说就容易得多了。
2. 用微积分来计算π\piπ
2.1 原理
小学时候就知道了圆的面积公式Sπr2S\pi r^2Sπr2,到了高中学习了微积分方程与曲线之后可以知道 x2y2r2x^2 y^2 r^2x2y2r2 表示一个圆如果y0y0y0则表示上半圆这个时候上半圆可以表达为一个函数: y(r2−x2)y \sqrt{(r^2-x^2)}y(r2−x2) 当它是一个单位圆时r1图形如下所示 根据从微积分的角度来看曲线y(x)与x0x∈[−r,r]y(x)与x0x\in [-r,r]y(x)与x0x∈[−r,r]围成的区域面积就是圆面积的一半即上半圆的面积。令圆面积为S,则有令圆面积为S,则有令圆面积为S,则有 Sπr22∫−rr(r2−x2)dxS \pi r^2 2\int_{-r}^{r} \sqrt{(r^2-x^2)} dxSπr22∫−rr(r2−x2)dx 现在的工作就变成计算上面右侧的积分式了。积分式用化曲为直马师傅称为接 化 发把圆分成许多直立的小矩形再求和小矩形的高为yi(r2−xi2),宽为Δx,Δx1ny_i\sqrt{(r^2-x_{i}^2)},宽为\Delta x, \Delta x\frac{1}{n}yi(r2−xi2),宽为Δx,Δxn1,n表示把圆的面积分为n个小矩形的面积来近似n越大则近似程度越好而且当n趋近于无穷时就和积分式完全一致了。 为了求π\piπ那我们只需要用程序帮我们把圆分成一个一个的小矩形再求和就行了设定圆的半径每个矩形的宽度就可以计算积分式的近似值了。
下面的程序就来计算下式 π2r2∫−rr(r2−x2)dx\pi \frac{2}{r^2}\int_{-r}^{r} \sqrt{(r^2-x^2)} dxπr22∫−rr(r2−x2)dx
2.2 代码
#include cmath
#include iostream/*** brief calculate sqrt(r^2-x^2)* * param x : * return constexpr long double */
constexpr inline long double IntegralFormula(const long double radius,const long double x)
{return std::sqrt(radius*radius-x*x);
} /*** brief 计算曲线ysqrt(r^2-x^2),在 x in [-r,r]的积分* * param radius : * param delta_x : * return constexpr long double */
constexpr long double Integral(const long double radius,const long double delta_x)
{long double sum 0.0;for (double x -radius; x radius; x delta_x){sum delta_x * IntegralFormula(radius,x);}return sum;
}/*** brief * * param radius : 半径* param bin_num : 分成小矩形的数目* return constexpr long double */
constexpr long double CalculatePi(const long double radius,double bin_num)
{long double delta_x 2 * radius / bin_num;long double integral Integral(radius,delta_x);long double pi integral * 2.0 / (radius * radius);return pi;
}/*** brief 计算pi值用单位圆的上半圆做积分ysqrt(r^2-x^2),x in [-r,r]* */
void Test()
{constexpr long double true_pi 3.141592653589793;printf(True PI: %.15Lf\n,true_pi);for(double radius 10; radius 100; radius*10)for(double bin_num 100000; bin_num 10000000; bin_num*10){printf(radius:%f, \t bin_num: %f,\t pi: %.20Lf \n,radius,bin_num,CalculatePi(radius,bin_num));}}void Test2()
{double radius 10000;double bin_num 100000;printf(radius:%f, \t bin_num: %f,\t pi: %.20Lf \n,radius,bin_num,CalculatePi(radius,bin_num));
}int main()
{Test();Test2();return 0;
}2.3 结果
输出
True PI: 3.141592653589793
radius:10.000000, bin_num: 100000.000000, pi: 3.14159254840509465393
radius:10.000000, bin_num: 1000000.000000, pi: 3.14159265028029712060
radius:10.000000, bin_num: 10000000.000000, pi: 3.14159265331958147799
radius:100.000000, bin_num: 100000.000000, pi: 3.14159254846500206543
radius:100.000000, bin_num: 1000000.000000, pi: 3.14159265024260935645
radius:100.000000, bin_num: 10000000.000000, pi: 3.14159265331696711159
radius:10000.000000, bin_num: 100000.000000, pi: 3.14159254840753097960
2.4 分析
这重方式用long double的计算精度但是最后计算的精度最高只到3.141592653,小数点后9位。分再多的小矩形也没用了因为计算时候的截断误差已经足够影响计算精度了。不知道有没有什么好的策略保持计算精度的。