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基础入门之seed()方法的使用
May 15 Python
Python实现LRU算法的2种方法
Jun 24 Python
Django返回json数据用法示例
Sep 18 Python
opencv实现简单人脸识别
Feb 19 Python
详解Python 中sys.stdin.readline()的用法
Sep 12 Python
python django中8000端口被占用的解决
Dec 17 Python
TensorBoard 计算图的查看方式
Feb 15 Python
Python基于内置库pytesseract实现图片验证码识别功能
Feb 24 Python
Python多线程多进程实例对比解析
Mar 12 Python
Python MOCK SERVER moco模拟接口测试过程解析
Apr 13 Python
python中append函数用法讲解
Dec 11 Python
numba提升python运行速度的实例方法
Jan 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
PHP爆绝对路径方法收集整理
2012/09/17 PHP
浅析虚拟主机服务器php fsockopen函数被禁用的解决办法
2013/08/07 PHP
PHP设计模式(五)适配器模式Adapter实例详解【结构型】
2020/05/02 PHP
JavaScript 读取元素的CSS信息的代码
2010/02/07 Javascript
js 实现的可折叠留言板(附源码下载)
2014/07/01 Javascript
兼容Firefox的Javascript XSLT 处理XML文件
2014/12/31 Javascript
深入解读JavaScript中的Iterator和for-of循环
2015/07/28 Javascript
JS Array.slice 截取数组的实现方法
2016/01/02 Javascript
javascript截图 jQuery插件imgAreaSelect使用详解
2016/05/04 Javascript
浅谈jquery中使用canvas的问题
2016/10/10 Javascript
vue中渐进过渡效果实现
2016/10/27 Javascript
JavaScript 网页中实现一个计算当年还剩多少时间的倒数计时程序
2017/01/25 Javascript
图文介绍Vue父组件向子组件传值
2018/02/17 Javascript
js中Generator函数的深入讲解
2019/04/07 Javascript
关于layui表单中按钮自动提交的解决方法
2019/09/09 Javascript
解决layer 动态加载select 失效的问题
2019/09/18 Javascript
通过滑动翻页效果实现和移动端click事件问题
2021/01/26 Javascript
python uuid模块使用实例
2015/04/08 Python
Python切换pip安装源的方法详解
2016/11/18 Python
Python实现正弦信号的时域波形和频谱图示例【基于matplotlib】
2018/05/04 Python
Python使用combinations实现排列组合的方法
2018/11/13 Python
Python给图像添加噪声具体操作
2019/03/03 Python
python暴力解压rar加密文件过程详解
2019/07/05 Python
python实现同一局域网下传输图片
2020/03/20 Python
python不同系统中打开方法
2020/06/23 Python
浅析python函数式编程
2020/09/26 Python
Python 实现集合Set的示例
2020/12/21 Python
利用python实现汉诺塔游戏
2021/03/01 Python
墨尔本最受欢迎的复古风格品牌:Princess Highway
2018/12/21 全球购物
绢花、人造花和人造花卉:BLOOM
2019/08/07 全球购物
给酒店员工的表扬信
2014/01/11 职场文书
民生工程实施方案
2014/03/22 职场文书
MySQL Router的安装部署
2021/04/24 MySQL
Java新手教程之ArrayList的基本使用
2021/06/20 Java/Android
Java并发编程必备之Future机制
2021/06/30 Java/Android
详解Spring Security中的HttpBasic登录验证模式
2022/03/17 Java/Android