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中的多进程与多线程的使用
Apr 07 Python
Python编写生成验证码的脚本的教程
May 04 Python
Django框架中处理URLconf中特定的URL的方法
Jul 20 Python
利用python实现命令行有道词典的方法示例
Jan 31 Python
PyCharm代码格式调整方法
May 23 Python
详解python3中的真值测试
Aug 13 Python
Python中Numpy mat的使用详解
May 24 Python
python 根据字典的键值进行排序的方法
Jul 24 Python
python使用正则表达式匹配txt特定字符串(有换行)
Dec 09 Python
对Pytorch 中的contiguous理解说明
Mar 03 Python
opencv实现图像几何变换
Mar 24 Python
python 单机五子棋对战游戏
Apr 28 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
PHP语法速查表
2007/01/02 PHP
PHP中文分词的简单实现代码分享
2011/07/17 PHP
PHP+Ajax检测用户名或邮件注册时是否已经存在实例教程
2014/08/23 PHP
PHP实现添加购物车功能
2017/03/06 PHP
Laravel框架中自定义模板指令总结
2017/12/17 PHP
做网页的一些技巧
2007/02/01 Javascript
Jquery Ajax 学习实例2 向页面发出请求 返回JSon格式数据
2010/03/15 Javascript
javascript中最常用的继承模式 组合继承
2010/08/12 Javascript
jQuery布局插件UI Layout简介及使用方法
2013/04/03 Javascript
Javascript代码在页面加载时的执行顺序介绍
2013/05/03 Javascript
JavaScript实现信用卡校验方法
2015/04/07 Javascript
JavaScript实现Iterator模式实例分析
2015/06/09 Javascript
使用coffeescript编写node.js项目的方法汇总
2015/08/05 Javascript
JavaScript 模块的循环加载实现方法
2015/12/13 Javascript
javascript结合Flexbox简单实现滑动拼图游戏
2016/02/18 Javascript
JS模态窗口返回值兼容问题的完美解决方法
2016/05/28 Javascript
浅谈Javascript数据属性与访问器属性
2016/07/26 Javascript
jQuery中的select操作详解
2016/11/29 Javascript
微信小程序 picker-view 组件详解及简单实例
2017/01/10 Javascript
js实现一键复制功能
2017/03/16 Javascript
JS实现排行榜文字向上滚动轮播效果
2019/11/26 Javascript
WebStorm中如何将自己的代码上传到github示例详解
2020/10/28 Javascript
[49:42]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第一局
2016/03/04 DOTA
Python开发编码规范
2006/09/08 Python
使用pandas读取文件的实现
2019/07/31 Python
python线程安全及多进程多线程实现方法详解
2019/09/27 Python
Python sublime安装及配置过程详解
2020/06/29 Python
Python实现钉钉/企业微信自动打卡的示例代码
2021/02/02 Python
python中openpyxl和xlsxwriter对Excel的操作方法
2021/03/01 Python
HTML5新增的标签和属性归纳总结
2018/05/02 HTML / CSS
JDK安装目录下有哪些内容
2014/08/25 面试题
四种会话跟踪技术
2015/05/20 面试题
组工干部演讲稿
2014/09/02 职场文书
公司领导九九重阳节发言稿2014
2014/09/25 职场文书
教师自查自纠材料
2014/10/14 职场文书
流动人口婚育证明
2014/10/19 职场文书