1. 引言

本文主要用于对比使用Python来实现数学中积分的几种计算方式,并和真值进行对比,加深大家对积分运算实现方式的理解。

闲话少说,我们直接开始吧。 :)

2. 举个栗子

为了加深大家的印象,首先我们来看个例子:
对下述三次函数
f(x)=x3−4x2+4x+2f(x)=x^3-4x^2+4x+2f(x)=x3−4x2+4x+2
进行积分运算:
I=∫abf(x)dx=∫ab(x3−4x2+4x+2)dxI = \int_a^bf(x)dx= \int_a^b(x^3-4x^2+4x+2)dx\, I=∫ab​f(x)dx=∫ab​(x3−4x2+4x+2)dx
图示如下:

如果 a=1/2a=1/2a=1/2 , b=5/2b=5/2b=5/2,则上述积分的值为:

I=(x44−4x33+2x2+2x)∣ab=6112≈5.0833I=(\frac{x^4}{4}-\frac{4x^3}{3}+2x^2+2x)|_{a}^{b}=\frac{61}{12} \approx 5.0833 I=(4x4​−34x3​+2x2+2x)∣ab​=1261​≈5.0833

3. 矩形计算面积

我们知道,在数学中,积分运算表示上述曲线和x轴围成的封闭区域的面积,为此,我们在数值预算中,来近似计算上述区域的面积,最直观的想法就是拆成一个个小的矩形来计算对应的面积。

3.1 左侧边长计算面积

为了计算每个小矩形的面积,设计到边长高的选择,这里我么以左侧函数取值作为对应矩形的高来计算相应的小矩形的面积,图示如下:

对应的代码如下:

import numpy as np
x = np.linspace(0, 3, 1001)
f = lambda x: x**3 - 4*x**2 + 4*x + 2
a = 0.5
b = 2.5
Ax = np.linspace(a, b, 101)
Ay = f(Ax)
def defInt_left(f, a, b, N):# left-hand pointresult = 0; FX = []; Xn = []dx = abs(b - a)/Nwhile a < b:result += f(a)*dxFX += [f(a)]Xn += [a]a += dxreturn result, FX, Xn, dx
N = 4
I_left, FX, Xn, dx = defInt_left(f, a, b, N)
print(I_left)

上述代码中,我们将横坐标拆分为4小份,也就是拆分成4个小矩形,然后使用函数左侧的点坐位小矩形的高,上述代码的运行结果如下:

5.25

3.2 右侧边长计算面积

这里和上述原理类似,只不过每个小矩形的高采用右侧边长函数取值来近似计算,图例如下:

样例代码如下:

def defInt_right(f, a, b, N):# right-hand pointresult = 0; FX = []; Xn = []dx = abs(b - a)/Nwhile a < b:result += f(a + dx)*dxFX += [f(a + dx)]Xn += [a]a += dxreturn result, FX, Xn, dxN = 4
I_right, FX, Xn, dx = defInt_right(f, a, b, N)
print(I_right)

运行结果如下:

5.0

3.3 中值边长计算面积

看了上述两种近似计算方式,有同学就说有取左侧点算出来面积大的,有取右侧点算出来面积小的,那干脆折中一下,我们来以中值坐位矩形的高来计算对应的面积。图例如下:

代码实现如下:

def defInt_middle(f, a, b, N):# middle pointresult = 0; FX = []; Xn = []dx = abs(b - a)/Nwhile a < b:result += f(a + dx/2)*dxFX += [f(a + dx/2)]Xn += [a]a += dxreturn result, FX, Xn, dxN = 4
I_mid, FX, Xn, dx = defInt_middle(f, a, b, N)
print(I_mid)

运行结果如下:

5.0625

4. 梯形计算面积

读到这里的同学可能会思考,既然可以将封闭区域划分成一个个的小矩形,那当然也可以将其划分成梯形来近似计算相应的面积,图例如下:

样例代码如下:

def defInt_trapezoid(f, a, b, N):# trapezoidal ruleresult = 0; FXa, FXb = [], []; Xn = []dx = abs(b - a)/Nwhile a < b:result += (f(a) + f(a + dx))*dx/2FXa += [f(a)]; FXb += [f(a + dx)]Xn += [a]a += dxreturn result, FXa, FXb, Xn, dxN = 4
I_trap, FXa, FXb, Xn, dx = defInt_trapezoid(f, a, b, N)
print(I_trap)

运行结果如下:

5.125

5. 真值比对

最后,我们来针对不同的N来讲封闭区域划分成对应的小份,分别针对性的计算上述四种方式的积分值,样例代码如下:

Nx = range(1, 11)
I1, I2, I3, I4 = [], [], [], []
for Ni in Nx:i1, *_ = defInt_left(f, a, b, Ni); I1 += [i1];i2, *_ = defInt_right(f, a, b, Ni); I2 += [i2];i3, *_ = defInt_middle(f, a, b, Ni); I3 += [i3];i4, *_ = defInt_trapezoid(f, a, b, Ni); I4 += [i4];

最后将其与真值进行对比,如下:


可以看出,随着划分区域的增多,采用梯形计算面积方式最逼近真值。

6. 总结

本文重点介绍了使用不同面积划分方法来近似计算积分取值的原理和相应的代码实现,其中采用梯形计算面积的方式随着划分子区域数目的增加最接近真值,推荐大家使用。

您学废了吗?


关注公众号《AI算法之道》,获取更多AI算法资讯。

用Python实现数值积分相关推荐

  1. python求数值积分_Python大数据处理-Scipy基础入门,数值积分计算

    温馨提示:阅读本文只需要1分钟,您就可以掌握Scipy进行定积分计算.二重.三重积分.多重积分的计算.继续承接上文学习Scipy科学数据处理,为我们后面Python大数据处理开发打基础.今天主要学习分 ...

  2. scipy/python quad()数值积分

    一维积分quad()函数的用法 对(1-x**2)**0.5进行积分 def f(x):return (1-x**2)**(1/2)w, err = integrate.quad(f,-1,1) pr ...

  3. 线性联立方程的高斯赛德尔迭代(Gauss-Seidel iteration)(python,数值积分)

    第九课 线性联立方程的高斯赛德尔迭代 在雅可比迭代中,{x}k+1(在上一课中被称为xnew)的所有分量都是使用{x}k(在上一课中为x)的分量推出的.因此,新的向量值完全是根据旧的向量值获得的. 然 ...

  4. python数值积分_python实现数值积分的Simpson方法实例分析

    本文实例讲述了python实现数值积分的Simpson方法.分享给大家供大家参考.具体如下: #coding = utf-8 #simpson 法计算积分,数值积分,效果非常理想 from math ...

  5. python二重积分0到正无穷_python函数的数值二重积分

    我有点困在一个函数上,我试图通过scipy,python进行数值积分.在 为了简单起见,我将函数定义为:integral f(x,y)= SUM[double integral(ax+by)dxdy] ...

  6. python怎么算积分_利用python求积分的实例

    利用python求积分的实例 python的numpy库集成了很多的函数.利用其中的函数可以很方便的解决一些数学问题.本篇介绍如何使用python的numpy来求解积分. 代码如下: # -*- co ...

  7. 人工智能之数学基础篇—微积分

    人工智能之数学基础篇-微积分 1 微积分的基本思想 2 微积分的解释 3 定积分 3.1 定积分的定义 3.2 定积分的几何含义 4 定积分的性质 5 牛顿一莱布尼茨公式 5.1 积分上限的函数及其导 ...

  8. 复合数值积分方法以及Python程序实现

    ■ 前言 在 Composite Numerical Integration 中给出了三种复合数值积分方法它们分别是: Newton-Cotes Formulas 01三种方法的公式及其Python程 ...

  9. python数值积分_python与计算物理:实现数值积分的Simpson方法

    1.[代码]python与计算物理:实现数值积分的Simpson方法. #!/usr/bin/env python #coding=utf-8 ''' Created on 2012年10月27日 @ ...

最新文章

  1. java日志切割工具_用 Java 实现的日志切割清理工具
  2. 网络推广专员敲黑板了,教你网站优化中如何更好地编写网站标题?
  3. 电脑内存和磁盘空间有什么区别与联系
  4. 程序员 rs编码_为什么声明性编码使您成为更好的程序员
  5. 从0到1构建美团压测工具
  6. 现代生活已经离不开的银行卡支付,背后原理其实没你想象的那么难!
  7. 群组密钥交换的新方法研究与分析【会议】
  8. pyDes vs pycrypto
  9. deepin mysql管理工具_[LINUX]DeepIn下基础开发环境搭建
  10. 软件系统开发费用的估算——功能点方法
  11. python标注cad桩位_如何在图纸上作出桩位坐标及大量编号
  12. webpack搭建vue项目步骤详解
  13. 7月的尾巴,你是XXX
  14. PAT甲级1146 Topological Order (25 分)
  15. 线上学习老师或者学习委员如何收集作业(进来的同志都体会到收作业的苦衷!尤其是学委!通过学习通方法)学委必须要会!
  16. 500套优秀简历模板,送给您!
  17. 没有购买域名和服务器,怎么搭建网站?(一)
  18. docker搭建kong、konga步骤
  19. AI时代的大门已经打开,Tesra超算网络将加速这个进程!
  20. UnsupportedOperationException; ImmutableCollections.uoe

热门文章

  1. Core Temp实时监控CPU温度/内存使用率/CPU主频
  2. 波兰科研人员提出可准确区分活人与死人的虹膜识别技术
  3. ahk编程_趣味AHK编程从入门到精通 - 主页
  4. 计算机网络之TCP中TIME_WAIT状态意义详解
  5. 《Knowledge Base Question Answering via Encoding of Complex Query Graphs》论文笔记
  6. 亚马逊、速卖通、ebay、wish、Lazada、Shopee是如何自己养国外买家账号测评的?
  7. countif和sum套用_SUM、SUMIF、COUNTIF函数使用方法
  8. matlab empty sym,matlab解方程时返回[ empty sym ]
  9. android 自定义倒计时控件(圆形倒计时显示)
  10. 模拟机选彩票 我的算法