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 ORM框架SQLAlchemy学习笔记之安装和简单查询实例
Jun 10 Python
python通过yield实现数组全排列的方法
Mar 18 Python
Python编程中的异常处理教程
Aug 21 Python
详解Python 序列化Serialize 和 反序列化Deserialize
Aug 20 Python
彻底搞懂Python字符编码
Jan 23 Python
django文档学习之applications使用详解
Jan 29 Python
python实现微信小程序自动回复
Sep 10 Python
python实现狄克斯特拉算法
Jan 17 Python
python 如何去除字符串头尾的多余符号
Nov 19 Python
快速解决jupyter notebook启动需要密码的问题
Apr 21 Python
删除pycharm鼠标右键快捷键打开项目的操作
Jan 16 Python
python 通过使用Yolact训练数据集
Apr 06 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 Cookie的使用教程详解
2013/06/03 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
基于swoole实现多人聊天室
2018/06/14 PHP
Javascript常用运算符(Operators)-javascript基础教程
2007/12/14 Javascript
使用jquery的ajax需要注意的地方dataType的设置
2013/08/12 Javascript
js中arguments,caller,callee,apply的用法小结
2014/01/28 Javascript
提升PHP安全:8个必须修改的PHP默认配置
2014/11/17 Javascript
jQuery的css()方法用法实例
2014/12/24 Javascript
JS实现的新浪微博大厅文字内容滚动效果代码
2015/11/05 Javascript
动态加载JavaScript文件的两种方法
2016/04/22 Javascript
基于jQuery实现歌词滚动版音乐播放器的代码
2016/09/17 Javascript
jQuery动态移除和添加背景图片的方法详解
2017/03/07 Javascript
JavaScript输入框字数实时统计更新
2017/06/17 Javascript
js异步编程小技巧详解
2017/08/14 Javascript
微信小程序实现分享到朋友圈功能
2018/07/19 Javascript
解决vue项目打包上服务器显示404错误,本地没出错的问题
2020/11/03 Javascript
[51:20]完美世界DOTA2联赛PWL S2 Magma vs PXG 第一场 11.28
2020/12/01 DOTA
python中urllib模块用法实例详解
2014/11/19 Python
Python判断值是否在list或set中的性能对比分析
2016/04/16 Python
轻松实现TensorFlow微信跳一跳的AI
2018/01/05 Python
python 自动去除空行的实例
2018/07/24 Python
python消费kafka数据批量插入到es的方法
2018/12/27 Python
Python爬虫使用bs4方法实现数据解析
2020/08/25 Python
Python 爬取淘宝商品信息栏目的实现
2021/02/06 Python
澳大利亚波西米亚风连衣裙在线商店:Fortunate One
2019/04/01 全球购物
zooplus意大利:在线宠物商店
2019/08/07 全球购物
研究生导师评语
2014/12/31 职场文书
婚庆公司开业主持词
2015/06/30 职场文书
货款欠条范本
2015/07/03 职场文书
《火烧云》教学反思
2016/02/23 职场文书
2019职场实习报告该怎么写?
2019/07/01 职场文书
电子表的操作介绍说明书
2019/10/28 职场文书
MySQL通过binlog恢复数据
2021/05/27 MySQL
基于Redis的List实现特价商品列表功能
2021/08/30 Redis
解决Mysql多行子查询的使用及空值问题
2022/01/22 MySQL
Python实现日志实时监测的示例详解
2022/04/06 Python