复化梯形求积分实例——用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关闭windows进程的方法
Apr 18 Python
python实现的简单文本类游戏实例
Apr 28 Python
Python实现简单多线程任务队列
Feb 27 Python
Python将图片批量从png格式转换至WebP格式
Aug 22 Python
python+opencv轮廓检测代码解析
Jan 05 Python
手把手教你用python抢票回家过年(代码简单)
Jan 21 Python
pandas apply 函数 实现多进程的示例讲解
Apr 20 Python
python3.6.3+opencv3.3.0实现动态人脸捕获
May 25 Python
学Python 3的理由和必要性
Nov 19 Python
OpenCV哈里斯(Harris)角点检测的实现
Jan 15 Python
Python基于class()实现面向对象原理详解
Mar 26 Python
基于PyQt5制作一个群发邮件工具
Apr 08 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递归调用的小技巧讲解
2013/02/19 PHP
解析php中die(),exit(),return的区别
2013/06/20 PHP
关于Laravel参数验证的一些疑与惑
2019/11/19 PHP
js 无提示关闭浏览器页面的代码
2010/03/09 Javascript
Js中setTimeout()和setInterval() 何时被调用执行的用法
2013/04/12 Javascript
js变换显示图片的实例
2013/04/16 Javascript
使用js检测浏览器的实现代码
2013/05/14 Javascript
js实现(全选)多选按钮的方法【附实例】
2016/03/30 Javascript
Javascript对象字面量的理解
2016/06/22 Javascript
详解js中的apply与call的用法
2016/07/30 Javascript
微信小程序 视图层(xx.xml)和逻辑层(xx.js)详细介绍
2016/10/13 Javascript
BootStrap Validator对于隐藏域验证和程序赋值即时验证的问题浅析
2016/12/01 Javascript
jQuery Easyui加载表格出错时在表格中间显示自定义的提示内容
2016/12/08 Javascript
vue + element-ui实现简洁的导入导出功能
2017/12/22 Javascript
vue2.0 中使用transition实现动画效果使用心得
2018/08/13 Javascript
VUE兄弟组件传值操作实例分析
2019/10/26 Javascript
微信小程序顶部导航栏可滑动并选中放大
2019/12/05 Javascript
springboot+vue+对接支付宝接口+二维码扫描支付功能(沙箱环境)
2020/10/15 Javascript
JavaScript 中的六种循环方法
2021/01/06 Javascript
Python中的choice()方法使用详解
2015/05/15 Python
Python判断一个文件夹内哪些文件是图片的实例
2018/12/07 Python
Scrapy框架爬取Boss直聘网Python职位信息的源码
2019/02/22 Python
python图形绘制奥运五环实例讲解
2019/09/14 Python
Python实现平行坐标图的绘制(plotly)方式
2019/11/22 Python
flask框架渲染Jinja模板与传入模板变量操作详解
2020/01/25 Python
python和JavaScript哪个容易上手
2020/06/23 Python
CSS3+DIV实现漂亮的动画彩色标签
2016/06/16 HTML / CSS
HTML5 Canvas基本线条绘制的实例教程
2016/03/17 HTML / CSS
波兰在线儿童和婴儿用品零售商:pinkorblue
2019/06/29 全球购物
怎样客观的做好自我评价
2013/12/28 职场文书
语文教学感言
2014/02/06 职场文书
党员党性分析材料
2014/02/17 职场文书
《吃水不忘挖井人》教学反思
2014/04/15 职场文书
中药学专业毕业生推荐信
2014/07/10 职场文书
销售员试用期自我评价
2014/09/15 职场文书
Go归并排序算法的实现方法
2022/04/06 Golang