首页/文章/ 详情

计算机模拟定积分的定义

7月前浏览2620

黎曼(Riemann)对定积分的定义是:积分区间划分为无数子区间,子区间内任意一点的函数值乘以子区间的长度得到一个矩形面积,然后将这些矩形面积累加起来可以得到积分值。

计算π的值

定积分的精确定义

对于定积分    ,在[0,1]内随机取一个数r,通过    转换成矩形的高。再乘以矩形的宽度1,就是一个矩形的面积。


经过多达1000000000次的重复计算,并把这些面积相加,再除以重复计算的次数,得到的值应该是一个接近PI的实数。且计算的次数越多,误差就越小。以下是C++代码































#include <iostream>#include <iomanip>#include <random>#include <cmath>
const size_t n{ 1000000000 };int main(){    std::random_device rd;    std::default_random_engine rng{ rd() };
   std::uniform_real_distribution< > values{ 0.0, 1.0 };    //生成随机数种子    double sum{};
   for (auto counter{ 1 }; counter <= n; ++counter)    {        sum += (4 / (1 + pow(values(rng), 2)) );
   }
   std::cout << "the value of PI is:" <<         std::fixed << std::setprecision(8) << sum / n << std::endl;
   system(" pause ");    return 0;                                                                                }

运行结果为

对于uniform_real_distribution是半开范围[  )。也是就是说上面的例子中,能产生0.0,但不会产生1.0。

★★★★往期相关★★★★

数值积分|中点法则(Midpoint Rule)

数值积分|龙贝格公式

数值积分|自适应辛普森积分公式

数值积分|自适应梯形积分

数值积分|牛顿-柯特斯公式

数值积分|高斯积分

数值积分|泰勒(Taylor)公式求积分

数值积分| 辛普森公式

Python实现辛普森公式

来源:数值分析与有限元编程
SystempythonUM
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2024-04-02
最近编辑:7月前
太白金星
本科 慢慢来
获赞 5粉丝 10文章 321课程 0
点赞
收藏
作者推荐

数值积分|中点法则(Midpoint Rule)

黎曼(Riemann)对定积分的定义是:积分区间划分为无数子区间,子区间内任意一点的函数值乘以子区间的长度得到一个矩形面积,然后将这些矩形面积累加起来可以得到积分值。中点法则(Midpoint Rule)是取子区间的中点的函数值作为矩形的高,如图所示对于定积分 ,将积分区间 划分成4个等长子区间,每个子区间中点的函数值为 .可以得到定积分的近似值为: 如果划分为8个子区间,可得到 精确值是0.69314781... 子区间划分越多,误差就越小。为了配合编程实现,可以通过将子区间的数量增加三倍来设计算法,而不是前面的辛普森,龙贝格公式增加两倍子区间。如图所示,空心圆圈表示必须计算的新值,而实心圆圈表示前一个迭代步计算的值。 可得到递推式: [算例]用中点法则求 import math### Midpoint ruler求积分### y = 4/( 1+x^2 )def Func(x): return 4/( 1+pow(x,2) ) def MidPointIntegrate(Func, a, b, eps = 1e-6): kmax = 5000 # 最大迭代步数 f1p6 = 1./6. f5p6 = 5./6. h = b-a n = 1 m0 = h * Func(a+0.5*h) for k in range(1,kmax+1): sumf = 0 for i in range(1,n+1): sumf += Func(a+(i-f5p6)*h) + Func(a+(i-f1p6)*h) m = (m0 + h*sumf)/3 if (math.fabs(m - m0) &lt;= eps * math.fabs(m)): break h /= 3 n *= 3 m0 = m if (k &gt;= kmax): print(&quot;已经达到最大迭代步数!&quot;) return m S = MidPointIntegrate(Func, 0, 1, eps = 1e-6)print(S) 结果为来源:数值分析与有限元编程

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈