首页/文章/ 详情

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

8月前浏览5221

数值积分| 辛普森公式

提到,辛普森积分最简单的形式是

 

也就是说至少要三个积分点,两个积分子区间。所以,自适应辛普森积分公式要从S1起步,即

 

将    式与自适应梯形公式

 
 

比较,可得

 
 

由此可以得到递推式

 

若以    表示前后两次计算结果的相对误差,即

 

若满足要求,则停止计算。python代码












































import math###自适应辛普森公式求积分### y = 1/( 1+x^2 )

def Func(x):    return 1/( 1+pow(x,2) )    
def AdaptiveSimpsonCtrl(Func, a, b, eps = 1e-6):    kmax = 9000   #最大迭代步数    h = b-a       # 积分区间    n = 1    t0 = 0.5*h*(Func(a) + Func(b))          for k in range(1,kmax+1):        sumf = 0        for i in range(1,n+1): sumf += Func(a+(i-0.5)*h)                t = 0.5*(t0 + h*sumf)                s = (4*t - t0)/3                if (k > 1):            if (math.fabs(s-s0) <= eps * math.fabs(s)): break            if (math.fabs(s) <= eps and math.fabs(s) <= math.fabs(s-s0)): break                    h *= 0.5        n *= 2        s0 = s        t0 = t            if (k >= kmax): print("已经达到最大迭代步数!")        return s    
S = AdaptiveSimpsonCtrl(Func, 0, 1, eps = 1e-6)print(S)

计算结果是0.7853981628062056,精确值为    

算法基本原理:把原区间分为一系列小区间(n份),在每个小区间上都用小的梯形面积来近似代替原函数的积分,当小区间足够小时,就可以得到原来积分的近似值,直到求得的积分结果满足要求的精度为止。但是这个过程中有一个问题是步长的取值,步长太大精度难以保证,步长太小会导致计算量的增加。


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

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

数值积分| 辛普森公式

Python实现辛普森公式

建模| 利用辛普森公式计算湖泊面积

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

数值积分|二元函数的高斯积分

数值积分|高斯积分

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

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

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

在区间 上,采用梯形公式计算 的定积分 如果将区间 二等分,采用梯形公式计算 的定积分 其中 如果将区间 三等分,采用梯形公式计算 的定积分 其中 由此可以得到递推式 表示两次迭代的相对误差,即 若 满足要求,则停止迭代。python代码import math###自适应梯形公式求积分### y = 1/( 1+x^2 )def Func(x): return 1/( 1+pow(x,2) )def AdaptiveTrapzCtrl(Func, a, b, eps = 1e-6): kmax = 9000 #最大迭代步数 h = b-a # 积分区间 n = 1 t0 = 0.5*h*(Func(a) + Func(b)) for k in range(1,kmax+1): sumf = 0 for i in range(1,n+1): sumf += Func(a+(i-0.5)*h) t = 0.5*(t0 + h*sumf) if (k &gt; 1): if (math.fabs(t-t0) &lt;= eps*math.fabs(t)): break if (math.fabs(t) &lt;= eps and math.fabs(t) &lt;= math.fabs(t-t0)): break h *= 0.5 n *= 2 t0 = t if (k &gt;= kmax): print(&quot;已经达到最大迭代步数!&quot;) return t T = AdaptiveTrapzCtrl(Func, 0.6, 1, eps = 1e-6)print(T) 计算结果是0.24497869339807107,精确值为: 算法基本原理:把原区间分为一系列小区间(n份),在每个小区间上都用小的梯形面积来近似代替原函数的积分,当小区间足够小时,就可以得到原来积分的近似值,直到求得的积分结果满足要求的精度为止。但是这个过程中有一个问题是步长的取值,步长太大精度难以保证,步长太小会导致计算量的增加。来源:数值分析与有限元编程

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