Python龙贝格法求积分实例


Posted in Python onFebruary 29, 2020

我就废话不多说了,直接上代码吧!

# 龙贝格法求积分
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.首先,什么是梯形公式:

Python龙贝格法求积分实例

梯形公式表明:f(x)在[a,b]两点之间的积分(面积),近似地可以用一个梯形的面积表示。

2.显然,这个梯形公式对于不同的f(x)而言,其代数精度不同。为了能适合更多的f(x),我们一般使用牛顿-科特斯公式其中比较高次的公式来进行数值求积。但高次的缺陷是当次数大于8次,求积公式就会不稳定。因此,我们用于数值积分的牛顿-科特斯公式通常是一次的梯形公式、二次的辛普森公式和4此的科特斯公式。

辛普森公式:

Python龙贝格法求积分实例

科特斯公式:

Python龙贝格法求积分实例

3.牛顿-科特斯公式次数高于8次不能用,但是低次公式又精度不够。解决办法就是使用:复合梯形求积公式。复合求积公式就是在区间[a,b]上划分n格小区间。一个大区间[a,b]上用一次梯形公式精度不够,那么在n个小区间都使用梯形公式,最后将小区间的和累加起来,就可以得到整个大区间[a,b]的积分近似值。

a = x0 < x1 <x2 …<xn-1 < xn =b

Python龙贝格法求积分实例

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

注意:这里的k+1是下标

Python龙贝格法求积分实例

通过研究我们发现:T2n与Tn之间存在一些递推关系。

注意:这里的k+1/2是下标。并且其中的h/2是中的h是Tn(n等分中的h = (b-a)/n))

Python龙贝格法求积分实例

于是乎,我们可以一次推出T1,T2,T4,T8…T2n序列

引出这些之后,才是我们的主题:龙贝格求积公式

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

再用S2n序列构造C2n序列

最后用C2n序列构造R2n序列。

编程实现,理解下面的几个公式即可。

Python龙贝格法求积分实例

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 相关文章推荐
python处理json数据中的中文
Mar 06 Python
Python3中的列表,元组,字典,字符串相关知识小结
Nov 10 Python
Python生成8位随机字符串的方法分析
Dec 05 Python
Python批量发送post请求的实现代码
May 05 Python
python实现支付宝转账接口
May 07 Python
简单了解python元组tuple相关原理
Dec 02 Python
Python中Subprocess的不同函数解析
Dec 10 Python
Python 2种方法求某个范围内的所有素数(质数)
Jan 31 Python
pip install 使用国内镜像的方法示例
Apr 03 Python
python使用matplotlib的savefig保存时图片保存不完整的问题
Jan 08 Python
Python破解极验滑动验证码详细步骤
May 21 Python
python单向链表实例详解
May 25 Python
python计算导数并绘图的实例
Feb 29 #Python
细数nn.BCELoss与nn.CrossEntropyLoss的区别
Feb 29 #Python
Pytorch对Himmelblau函数的优化详解
Feb 29 #Python
Pytorch中的自动求梯度机制和Variable类实例
Feb 29 #Python
在pytorch中实现只让指定变量向后传播梯度
Feb 29 #Python
浅谈Pytorch中的自动求导函数backward()所需参数的含义
Feb 29 #Python
python数据预处理 :样本分布不均的解决(过采样和欠采样)
Feb 29 #Python
You might like
超人钢铁侠联手合作?美漫作家呼吁DC漫威合作联动以抵抗疫情
2020/04/09 欧美动漫
paypal即时到账php实现代码
2010/11/28 PHP
PHP下判断网址是否有效的代码
2011/10/08 PHP
php Imagick获取图片RGB颜色值
2014/07/28 PHP
CodeIgniter读写分离实现方法详解
2016/01/20 PHP
PHP基于PDO实现的SQLite操作类【包含增删改查及事务等操作】
2017/06/21 PHP
PHP实现阿里大鱼短信验证的实例代码
2017/07/10 PHP
js获取客户端外网ip的简单实例
2013/11/21 Javascript
Ext修改GridPanel数据和字体颜色、css属性等
2014/06/13 Javascript
js操作cookie保存浏览记录的方法
2015/12/25 Javascript
js学习阶段总结(必看篇)
2016/06/16 Javascript
JavaScript实现星星等级评价功能
2017/03/22 Javascript
详解angularJs中关于ng-class的三种使用方式说明
2017/06/02 Javascript
Node.js学习之地址解析模块URL的使用详解
2017/09/28 Javascript
ES6基础之解构赋值(destructuring assignment)
2019/02/21 Javascript
javascript中undefined的本质解析
2019/07/31 Javascript
JS如何生成随机验证码
2020/03/02 Javascript
Vue插件之滑动验证码用法详解
2020/04/05 Javascript
jQuery实现穿梭框效果
2021/01/19 jQuery
[01:07:21]NAVI vs VG Supermajor 败者组 BO3 第二场 6.5
2018/06/06 DOTA
Python的高级Git库 Gittle
2014/09/22 Python
python中bisect模块用法实例
2014/09/25 Python
Django中Forms的使用代码解析
2018/02/10 Python
详解Python中的测试工具
2019/06/09 Python
python实现点击按钮修改数据的方法
2019/07/17 Python
django admin组件使用方法详解
2019/07/19 Python
如何为Python终端提供持久性历史记录
2019/09/03 Python
Python直接赋值及深浅拷贝原理详解
2020/09/05 Python
python3中编码获取网页的实例方法
2020/11/16 Python
CSS3制作半透明边框(Facebox)类似渐变
2012/12/09 HTML / CSS
人事科岗位职责范本
2014/03/02 职场文书
蓝颜请假条
2014/04/11 职场文书
2014年党的群众路线教育实践活动总结
2014/04/25 职场文书
信用卡工作证明模板
2014/09/14 职场文书
检讨书范文大全
2015/05/07 职场文书
公司车队管理制度
2015/08/04 职场文书