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爬虫之爬虫编写全记录
Nov 06 Python
关于你不想知道的所有Python3 unicode特性
Nov 28 Python
优化Python代码使其加快作用域内的查找
Mar 30 Python
Python中对元组和列表按条件进行排序的方法示例
Nov 10 Python
python 简单的绘图工具turtle使用详解
Jun 21 Python
Python通过OpenCV的findContours获取轮廓并切割实例
Jan 05 Python
python编程嵌套函数实例代码
Feb 11 Python
Python实现的将文件每一列写入列表功能示例【测试可用】
Mar 19 Python
python十进制和二进制的转换方法(含浮点数)
Jul 07 Python
Python反射和内置方法重写操作详解
Aug 27 Python
Django框架模板的使用方法示例
May 25 Python
Python3实现英文字母转换哥特式字体实例代码
Sep 01 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
codeigniter集成ucenter1.6双向通信的解决办法
2014/06/12 PHP
laravel5创建service provider和facade的方法详解
2016/07/26 PHP
Windows下php+mysql5.7配置教程
2017/05/16 PHP
PHP 返回数组后处理方法(开户成功后弹窗提示)
2017/07/03 PHP
重写javascript中window.confirm的行为
2012/10/21 Javascript
js 页面元素的几个用法总结
2013/11/18 Javascript
IE8的JavaScript点击事件(onclick)不兼容的解决方法
2013/11/22 Javascript
JS的get和set使用示例
2014/02/20 Javascript
NodeJS Web应用监听sock文件实例
2015/02/18 NodeJs
JavaScript通过元素索引号删除数组中对应元素的方法
2015/03/18 Javascript
纯JavaScript代码实现文本比较工具
2016/02/17 Javascript
JS实时弹出新消息提示框并有提示音响起的实现代码
2016/04/20 Javascript
Agularjs妙用双向数据绑定实现手风琴效果
2017/05/26 Javascript
vue 如何添加全局函数或全局变量以及单页面的title设置总结
2017/06/01 Javascript
javascript少儿编程关于返回值的函数内容
2018/05/27 Javascript
小程序scroll-view组件实现滚动的示例代码
2018/09/20 Javascript
详解webpack引入第三方库的方式以及注意事项
2019/01/15 Javascript
微信小程序实现轨迹回放的示例代码
2019/12/13 Javascript
[43:58]DOTA2-DPC中国联赛定级赛 LBZS vs SAG BO3第一场 1月8日
2021/03/11 DOTA
Python实现的递归神经网络简单示例
2017/08/11 Python
浅谈python之新式类
2018/08/12 Python
python selenium登录豆瓣网过程解析
2019/08/10 Python
pytorch 使用单个GPU与多个GPU进行训练与测试的方法
2019/08/19 Python
利用python读取YUV文件 转RGB 8bit/10bit通用
2019/12/09 Python
Python字符串的修改方法实例
2019/12/19 Python
关于多种方式完美解决Python pip命令下载第三方库的问题
2020/12/21 Python
Shopping happy life西班牙:以最优惠的价格提供最好的时尚配饰
2020/03/13 全球购物
医院护士的求职信范文
2013/12/26 职场文书
英语国培研修感言
2014/02/13 职场文书
工作经常出错的检讨书
2014/09/13 职场文书
地下停车场租赁协议范本
2014/10/07 职场文书
县政协领导班子群众路线教育实践活动四风问题整改方案
2014/10/26 职场文书
大班上学期个人总结
2015/02/13 职场文书
事业单位岗位说明书
2015/10/08 职场文书
2016年9月份红领巾广播稿
2015/12/21 职场文书
《去年的树》教学反思
2016/02/18 职场文书