复化梯形求积分实例——用Python进行数值计算


Posted in Python onNovember 20, 2019

用程序来求积分的方法有很多,这篇文章主要是有关牛顿-科特斯公式。

学过插值算法的同学最容易想到的就是用插值函数代替被积分函数来求积分,但实际上在大部分场景下这是行不通的。

插值函数一般是一个不超过n次的多项式,如果用插值函数来求积分的话,就会引进高次多项式求积分的问题。这样会将原来的求积分问题带到另一个求积分问题:如何求n次多项式的积分,而且当次数变高时,会出现龙悲歌现象,误差反而可能会增大,并且高次的插值求积公式有可能会变得不稳定:详细原因不赘述。

牛顿-科特斯公式解决这一问题的办法是将大的插值区间分为一堆小的插值区间,使得多项式的次数不会太高。然后通过引入参数函数

复化梯形求积分实例——用Python进行数值计算

将带有幂的项的取值范围固定在一个固定范围内,这样一来就将多项式带有幂的部分的求积变为一个固定的常数,只需手工算出来即可。这个常数可以直接带入多项式求积函数。

上式中x的求积分区间为[a, b],h = (b - a)/n, 这样一来积分区间变为[0, n],需要注意的是从这个公式可以看出一个大的区间被分为n个等长的小区间。 这一部分具体请参见任意一本有关数值计算的书!

n是一个事先确定好的值。

又因为一个大的插值区间需要被分为等长的多个小区间,并在这些小区间上分别进行插值和积分,因此此时的牛顿-科特斯公式被称为:复化牛顿-科特斯公式。

并且对于n的不同取值牛顿-科特斯有不同的名称: 当n=1时,叫做复化梯形公式,复化梯形公式也就是将每一个小区间都看为一个梯形(高为h,上底为f(t), 下底为f(t+1))。这与积分的本质:无限分隔 相同。

当n=2时,复化牛顿-科特斯公式被称为复化辛普森公式(非美国法律界著名的那个辛普森)。

我这篇文章实现的是复化梯形公式:

复化梯形求积分实例——用Python进行数值计算

首先写一个函数求节点函数值求和那部分:

"""
@brief: 求和 ∑f(xk) : xk表示等距节点的第k个节点,不包括端点
  xk = a + kh (k = 0, 1, 2, ...)
  积分区间为[a, b]
   
@param: xk  积分区间的等分点x坐标集合(不包括端点)
@param: func 求积函数
@return: 返回值为集合的和
"""
def sum_fun_xk(xk, func):
 return sum([func(each) for each in xk])

然后就可以写整个求积分函数了:

"""
@brief: 求func积分 :
   
@param: a 积分区间左端点
@param: b 积分区间右端点
@param: n 积分分为n等份(复化梯形求积分要求)
@param: func 求积函数
@return: 积分值
""" 
def integral(a, b, n, func):
 h = (b - a)/float(n)
 xk = [a + i*h for i in range(1, n)]
 return h/2 * (func(a) + 2 * sum_fun_xk(xk, func) + func(b))

相当的简单

试验:

当把大区间分为两个小区间时:

复化梯形求积分实例——用Python进行数值计算

分为20个小区间时:

复化梯形求积分实例——用Python进行数值计算

求的积分值就是这些彩色的梯形面积之和。

测试代码:

if __name__ == "__main__":
  
 func = lambda x: x**2
 a, b = 2, 8
 n = 20
 print integral(a, b, n, func)
  
 ''' 画图 '''
 import matplotlib.pyplot as plt
 plt.figure("play")
 ax1 = plt.subplot(111)
 plt.sca(ax1)
  
 tmpx = [2 + float(8-2) /50 * each for each in range(50+1)]
 plt.plot(tmpx, [func(each) for each in tmpx], linestyle = '-', color='black')
  
 for rang in range(n):
  tmpx = [a + float(8-2)/n * rang, a + float(8-2)/n * rang, a + float(8-2)/n * (rang+1), a + float(8-2)/n * (rang+1)]
  tmpy = [0, func(tmpx[1]), func(tmpx[2]), 0]
  c = ['r', 'y', 'b', 'g']
  plt.fill(tmpx, tmpy, color=c[rang%4])
 plt.grid(True)
 plt.show()

注意上面代码中的n并不是上文开篇提到的公式中的n,开篇提到的n是指将每一个具体的插值区间(也就是小区间)等距插n个节点,复化梯形公式的n是固定的为1.

而代码中的n指将大区间分为n个小区间。

以上这篇复化梯形求积分实例——用Python进行数值计算就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python调用cmd复制文件代码分享
Dec 27 Python
收集的几个Python小技巧分享
Nov 22 Python
python文件名和文件路径操作实例
Sep 29 Python
详解Django之auth模块(用户认证)
Apr 17 Python
Flask和Django框架中自定义模型类的表名、父类相关问题分析
Jul 19 Python
python的set处理二维数组转一维数组的方法示例
May 31 Python
django的聚合函数和aggregate、annotate方法使用详解
Jul 23 Python
python sorted方法和列表使用解析
Nov 18 Python
django框架auth模块用法实例详解
Dec 10 Python
python爬取网易云音乐热歌榜实例代码
Aug 07 Python
python代码实现扫码关注公众号登录的实战
Nov 01 Python
关于pytest结合csv模块实现csv格式的数据驱动问题
May 30 Python
Python实现数值积分方式
Nov 20 #Python
基于Python批量生成指定尺寸缩略图代码实例
Nov 20 #Python
python用quad、dblquad实现一维二维积分的实例详解
Nov 20 #Python
利用python实现AR教程
Nov 20 #Python
使用python实现画AR模型时序图
Nov 20 #Python
Python笔记之工厂模式
Nov 20 #Python
Python常用模块logging——日志输出功能(示例代码)
Nov 20 #Python
You might like
php+dojo 的数据库保存拖动布局的一个方法dojo 这里下载
2007/03/07 PHP
asp和php下textarea提交大量数据发生丢失的解决方法
2008/01/20 PHP
Yii学习总结之数据访问对象 (DAO)
2015/02/22 PHP
php遍历CSV类实例
2015/04/14 PHP
PHP函数func_num_args用法实例分析
2015/12/07 PHP
PHP获取当前执行php文件名的代码
2017/03/02 PHP
PHP操作Postgresql封装类与应用完整实例
2018/04/24 PHP
解决在Laravel 中处理OPTIONS请求的问题
2019/10/11 PHP
30个最佳jQuery Lightbox效果插件分享
2011/04/11 Javascript
jQuery中:eq()选择器用法实例
2014/12/29 Javascript
NodeJS学习笔记之MongoDB模块
2015/01/13 NodeJs
jquery ajax分页插件的简单实现
2016/01/27 Javascript
JavaScript浏览器对象模型BOM(BrowserObjectModel)实例详解
2016/11/29 Javascript
浅谈Webpack 是如何加载模块的
2018/05/24 Javascript
利用Decorator如何控制Koa路由详解
2018/06/26 Javascript
详解Angular中通过$location获取地址栏的参数
2018/08/02 Javascript
React注册倒计时功能的实现
2018/09/06 Javascript
vue全局自定义指令-元素拖拽的实现代码
2019/04/14 Javascript
小程序scroll-view安卓机隐藏横向滚动条的实现详解
2019/05/16 Javascript
vue表单验证之禁止input输入框输入空格
2020/12/03 Vue.js
python的urllib模块显示下载进度示例
2014/01/17 Python
微信跳一跳python辅助软件思路及图像识别源码解析
2018/01/04 Python
Python OpenCV获取视频的方法
2018/02/28 Python
Python如何使用k-means方法将列表中相似的句子归类
2019/08/08 Python
Python 如何操作 SQLite 数据库
2020/08/17 Python
关于Python3的import问题(pycharm可以运行命令行import错误)
2020/11/18 Python
基于HTML5陀螺仪实现ofo首页眼睛移动效果的示例
2017/07/31 HTML / CSS
美国便宜的横幅和标志印刷在线:Best of Signs
2019/05/29 全球购物
批评与自我批评发言稿
2014/10/15 职场文书
员工年终考核评语
2014/12/31 职场文书
高考学习决心书
2015/02/04 职场文书
离婚案件原告代理词
2015/05/23 职场文书
mongodb清除连接和日志的正确方法分享
2021/09/15 MongoDB
Go 中的空白标识符下划线
2022/03/25 Golang
zabbix配置nginx监控的实现
2022/05/25 Servers
在ubuntu下安装go开发环境的全过程
2022/08/05 Golang