Python实现龙贝格积分法:从复合梯形到高精度求解

周予安
周予安
发布时间:2026-10-14| 3人浏览过
原创

本文详细介绍Python中龙贝格(Romberg)求积公式的实现原理与代码。通过复合梯形公式生成序列,利用Richardson外推法依次构造Simpson、Cotes及Romberg序列,逐步提高积分精度。文章提供完整Python代码示例,展示如何设置积分上下限、精度要求及被积函数,适用于数值分析学习与工程计算参考。

Python龙贝格积分法实现概述

以下内容直接展示核心实现逻辑,省略冗余说明。


# 龙贝格法求积分
import math
a=0    # 积分下限
b=1    # 积分上限
eps=10**-5  # 精度
T=[]   # 复化梯形序列
S=[]   # Simpson序列
C=[]   # Cotes序列
R=[]   # Romberg序列
def func(x): # 被积函数
 y=math.exp(-x)
 return y
def Romberg(a,b,eps,func):
 h = b - a
 T.append(h * (func(a) + func(b)) / 2)
 ep=eps+1
 m=0
 while(ep>=eps):
  m=m+1
  t=0
  for i in range(2**(m-1)-1):
   t=t+func(a+(2*(i+1)-1)*h/2**m)*h/2**m
  t=t+T[-1]/2
  T.append(t)
  if m>=1:
   S.append((4**m*T[-1]-T[-2])/(4**m-1))
  if m>=2:
   C.append((4**m*S[-1]-S[-2])/(4**m-1))
  if m>=3:
   R.append((4**m*C[-1]-C[-2])/(4**m-1))
  if m>4:
   ep=abs(10*(R[-1]-R[-2]))
Romberg(a,b,eps,func)
# print(T)
# print(S)
# print(C)
# print(R)
# 计算机参考值0.6321205588
print("积分结果为:{:.5f}".format(R[-1]))

补充内容:使用Python实现数值分析中的龙贝格求积公式。

数值积分基础:梯形、辛普森与科特斯公式

关于复合梯形公式的背景介绍:

1. 首先明确梯形公式的定义:

梯形公式的核心思想是:函数f(x)在区间[a,b]上的定积分(即曲线下面积),可以近似等价于以a和b为底边的梯形面积。

2. 显然,该梯形公式对不同性质的f(x)具有不同的代数精度。为了适应更多类型的函数,通常采用较高次数的牛顿-科特斯公式进行数值求积。然而,高次公式存在缺陷:当多项式次数超过8次时,求积公式会出现数值不稳定现象。因此,实际数值积分中常用的牛顿-科特斯公式主要限于一次梯形公式、二次辛普森公式以及四次科特斯公式。

辛普森公式的表达式:

科特斯公式的表达式:

复合梯形公式与序列递推原理

3. 由于牛顿-科特斯公式次数高于8次不可用,而低次公式精度不足,解决方案是采用复合梯形求积公式。该方法将大区间[a,b]划分为n个小区间。若在大区间[a,b]上直接使用一次梯形公式精度不够,则在每个小区间上分别应用梯形公式,最后将所有小区间的积分结果累加,从而得到整个大区间[a,b]的积分近似值。

区间划分表示为:a = x0 < x1 < x2 … < xn-1 < xn =b

设Tn为将[a,b]等分为n段的复合梯形求积公式,其中h =(b-a)/n为小区间长度。此处的h/2概念类似于梯形公式中的(b-a)/2。

注意:这里的k+1表示下标索引。

经过研究分析发现:T2n与Tn之间存在特定的递推关系。

注意:这里的k+1/2表示下标。其中涉及的h/2里的h是指Tn序列中n等分时的小区间长度,即h = (b-a)/n。

基于上述关系,可以依次推导出T1, T2, T4, T8…直至T2n的序列值。

龙贝格公式构造与Python代码实现

在建立上述序列之后,正式引入本文主题:龙贝格求积公式。

龙贝格求积公式的本质是利用T2n序列构造出S2n序列,

接着利用S2n序列进一步构造C2n序列,

最后利用C2n序列构造出最终的R2n序列。

编程实现时,只需理解并应用上述几个关键公式即可。

Python编程具体代码如下:


# coding=UTF-8
# Author:winyn
'''
给定一个函数,如:f(x)= x^(3/2),和积分上下限a,b,用机械求积Romberg公式求积分。

'''
import numpy as np


def func(x):
 return x**(3/2)

class Romberg:
 def __init__(self, integ_dowlimit, integ_uplimit):
  '''
  初始化积分上限integ_uplimit和积分下限integ_dowlimit
  输入一个函数,输出函数在积分上下限的积分

  '''
  self.integ_uplimit = integ_uplimit
  self.integ_dowlimit = integ_dowlimit



 def calc(self):
  '''
  计算Richardson外推算法的四个序列

  '''
  t_seq1 = np.zeros(5, 'f')
  s_seq2 = np.zeros(4, 'f')
  c_seq3 = np.zeros(3, 'f')
  r_seq4 = np.zeros(2, 'f')
  # 循环生成hm间距序列
  hm = [(self.integ_uplimit - self.integ_dowlimit) / (2 ** i) for i in range(0,5)]
  print(hm)
  # 循环生成t_seq1
  fa = func(self.integ_dowlimit)
  fb = func(self.integ_uplimit)

  t0 = (1 / 2) * (self.integ_uplimit - self.integ_dowlimit) * (fa+fb)
  t_seq1[0] = t0

  for i in range(1, 5):
   sum = 0
   # 多出来的点的累加和
   for each in range(1, 2**i,2):
    sum =sum + hm[i]*func( self.integ_dowlimit+each * hm[i])#计算两项值
   temp1 = 1 / 2 * t_seq1[i - 1]
   temp2 =sum
   temp = temp1 + temp2
   # 求t_seql的1-4位
   t_seq1[i] = temp
  print('T序列:'+ str(list(t_seq1)))
  # 循环生成s_seq2
  s_seq2 = [round((4 * t_seq1[i + 1] - t_seq1[i]) / 3,6) for i in range(0, 4)]
  print('S序列:' + str(list(s_seq2)))
  # 循环生成c_seq3
  c_seq3 = [round((4 ** 2 * s_seq2[i + 1] - s_seq2[i]) / (4 ** 2 - 1),6) for i in range(0, 3)]
  print('C序列:' + str(list(c_seq3)))
  # 循环生成r_seq4
  r_seq4 = [round((4 ** 3 * c_seq3[i + 1] - c_seq3[i]) / (4 ** 3 - 1),6) for i in range(0, 2)]
  print('R序列:' + str(list(r_seq4)))
  return 'end'


rom = Romberg(0, 1)
print(rom.calc())

以上关于Python龙贝格法求积分的实例分享完毕,希望能为读者提供参考,也欢迎大家继续支持本站获取更多技术内容。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。