复化梯形求积分实例——用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 self,cls,decorator的理解
Jul 13 Python
python装饰器与递归算法详解
Feb 18 Python
Python实现的排列组合计算操作示例
Oct 13 Python
Python用户推荐系统曼哈顿算法实现完整代码
Dec 01 Python
python 获取当天每个准点时间戳的实例
May 22 Python
彻底理解Python中的yield关键字
Apr 01 Python
网易2016研发工程师编程题 奖学金(python)
Jun 19 Python
pandas 使用均值填充缺失值列的小技巧分享
Jul 04 Python
python读写文件write和flush的实现方式
Feb 21 Python
Pytorch 使用不同版本的cuda的方法步骤
Apr 02 Python
Elasticsearch py客户端库安装及使用方法解析
Sep 14 Python
python中sqllite插入numpy数组到数据库的实现方法
Jun 21 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 和 HTML
2006/10/09 PHP
数据库的日期格式转换
2006/10/09 PHP
php目录管理函数小结
2008/09/10 PHP
php文字水印和php图片水印实现代码(二种加水印方法)
2013/12/25 PHP
php 创建以UNIX时间戳命名的文件夹(示例代码)
2014/03/08 PHP
php实现的二分查找算法示例
2017/06/20 PHP
PHP微信PC二维码登陆的实现思路
2017/07/13 PHP
PHP回调函数与匿名函数实例详解
2017/08/16 PHP
动态创建的表格单元格中的事件实现代码
2008/12/30 Javascript
jquery实现的让超出显示范围外的导航自动固定屏幕最顶上
2011/09/22 Javascript
通过JS自动隐藏手机浏览器的地址栏实现原理与代码
2013/01/02 Javascript
jQuery弹性滑动导航菜单实现思路及代码
2013/05/02 Javascript
javascript loadScript异步加载脚本示例讲解
2013/11/14 Javascript
原生javascript实现拖动元素示例代码
2014/09/01 Javascript
Javascript实现商品秒杀倒计时(时间与服务器时间同步)
2015/09/16 Javascript
简单实现jQuery进度条轮播实例代码
2016/06/20 Javascript
详解vue slot插槽的使用方法
2017/06/13 Javascript
微信小程序实现点击图片旋转180度并且弹出下拉列表
2018/11/27 Javascript
详解vue中axios的使用与封装
2019/03/20 Javascript
Vue实现表格批量审核功能实例代码
2019/05/28 Javascript
JS实现点击掉落特效
2021/01/29 Javascript
[03:51]吞吞映像 每周精彩击杀top10第二弹
2014/06/25 DOTA
[00:37]食人魔魔法师轮盘吉兆顺应全新至宝将拥有额外款式
2019/12/19 DOTA
使用Python编写简单的画图板程序的示例教程
2015/12/08 Python
插入排序_Python与PHP的实现版(推荐)
2017/05/11 Python
Python 保存矩阵为Excel的实现方法
2019/01/28 Python
python对指定字符串逆序的6种方法(小结)
2020/04/02 Python
在python image 中实现安装中文字体
2020/05/16 Python
Python将list元素转存为CSV文件的实现
2020/11/16 Python
优秀学生干部个人的自我评价
2013/10/04 职场文书
英语专业大学生求职简历的自我评价
2013/10/18 职场文书
医学院校毕业生自荐信范文
2014/01/01 职场文书
办公室打字员岗位职责
2014/04/16 职场文书
2015年财务部工作总结
2015/04/10 职场文书
务工证明怎么写
2015/06/18 职场文书
民事纠纷协议书
2016/03/23 职场文书