微积分作为初等数学和高等数学的分水岭,在现代科学中有着极其重要的作用。17世纪末 ,微积分的概念和技巧不断扩展并被广泛应用于解决天文学、物理学中的各种实际问题。例如,求瞬时速度 、 曲线切线 、 曲线长 、曲线围成的面积 、 由面围成的体积等问题 。
微积分是高等数学中研究函数的微分、积分及有关概念和应用的数学分支 , 是数学的一个基础学科,内容包括极限 、 微分学、积分学及其应用 。微分学包括导数运算,是一套关于变化率的理论,在人工智能之数学基础篇—高等数学基础中篇中已经介绍过;积分学包括积分运算,为计算面积、 体积、 水压力等几何物理问题提供一套通用的方法。 本文将主要介绍微积分的一些核心概念及如何利用Python编程工具来解决定积分相关的问题 。
在介绍微积分理论之前先来看一个小故事,微积分基本定理又称为牛顿—莱布尼茨公式,从名字就可以看出两个人对微积分的创立都做出了很大贡献,但是在到底谁是微积分的创立者这一问题上,二人曾争论不休。莱布尼茨和牛顿曾是好朋友,但因为这件事,莱布尼茨至死没和牛顿和解。那到底是谁创立了微积分呢?后人核实,两人各自独立地创立了微积分,牛顿在研究物理中的运动问题过程中创立了微积分,而莱布尼茨是从几何方面出发也独立发现了微积分,所以又称牛顿—莱布尼茨公式。
微积分以研究函数变化规律为目的,主要运用到的数学工具就是微分和积分。
微分是对函数局部变化率的线性描述。微分学的基本思想是“无限细分”和“等效替代”,其几何意义如图1所示。设函数 y = f ( x ) y=f(x) y=f(x),假设函数上有一点 p p p,当点 p p p 在沿着横坐标 Δ x \Delta x Δx 移动时,其在纵坐标上的变化范围为 Δ y \Delta y Δy,如图1(a)所示。特别的,当 p p p 的移动范围足够小时( lim Δ x → 0 d y = 0 , lim Δ x → 0 d x = 0 \lim_{\Delta x\rightarrow 0}dy=0,\: \lim_{\Delta x\rightarrow 0}dx=0 limΔx→0dy=0,limΔx→0dx=0,如图1(b)所示), p p p 点纵坐标的变化值 Δ y \Delta y Δy 与该点切线的变化距离 d y dy dy 之间的差值 ∣ Δ y − d y ∣ \left | \Delta y-dy \right | ∣Δy−dy∣ 比 Δ y \Delta y Δy 要小的多,这时可以用 p p p 点附近的一个切线段来近似替代原函数。
p p p 点切线的斜率是导数,而 f ( x ) ′ = d y d x f\left ( x \right )^{'}=\frac{dy}{dx} f(x)′=dxdy,所以 d y = f ( x ) ′ d x dy = f\left ( x \right )^{'}dx dy=f(x)′dx。根据无穷小的概念, d x dx dx, d y dy dy 都是微分。
积分是在确定函数的导数基础上通过一定的数学方法对原函数进行求解的过程。积分的基本思想是通过微分的 “无限求和” 来进行的 。 微分是对函数的求导过程,因此可以将积分看作微分的一个逆向过程,其几何意义如图 2 所示。设函数 y = f ( x ) y=f(x) y=f(x) 把区间 [ a a a, b b b] 均分为 4 份,如图2(a)所示 ,整体等于部分之和,即 f ( b ) − f ( a ) = ∑ Δ y f(b)-f(a)=\sum \Delta y f(b)−f(a)=∑Δy。继续细分,如图2(b)所示,把区间均分到最细,即间隔为 d x dx dx,对应的 Δ y \Delta y Δy 也变成了 d y dy dy , 所以 f ( b ) − f ( a ) = ∑ d y f(b)-f(a)=\sum dy f(b)−f(a)=∑dy。根据前面微分的无限细分可知 d y = f ( x ) ′ d x dy = f\left ( x \right )^{'}dx dy=f(x)′dx,因此 f ( b ) − f ( a ) = ∑ f ( x ) ′ d x f(b)-f(a)=\sum f\left ( x \right )^{'}dx f(b)−f(a)=∑f(x)′dx。
下面来讨论一个问题,如何求解曲边梯形的面积?
设曲线方程为 y = f ( x ) y=f(x) y=f(x),在区间 [ a a a, b b b] 上非负、连续 。 由直线 x = a x=a x=a , x = b x=b x=b , y = 0 y=0 y=0 及曲线 y = f ( x ) y =f(x) y=f(x) 所围成的平面图形如图 3 所示,称之为曲边梯形,其中曲线弧段称为曲边梯形的曲边。
曲边梯形面积不像矩形 、圆等规则图形有特定的公式求解,但可以采用以直代曲的思想来进行求解。
分别以 4 个小矩形和 9 个小矩形替代,如图4所示 。
可以看出 9 个小矩形比 4 个小矩形求面积的精确度高,那么如果无限分割呢?在 a a a 与 b b b 之间分割出 n n n 等份, n n n 趋近于无穷,是不是会无限接近曲边梯形的面积呢? 曲边梯形的无限分割如图5所示。
因此,将其极限值
A = lim n → ∞ ∑ i = 1 n f ( ξ i ) Δ x i , x i − 1 < ξ i < x i A=\lim_{n\rightarrow \infty }\sum_{i=1}^{n}f\left ( \xi _{i} \right )\Delta x_{i},\: x_{i-1}< \xi _{i} < x_{i} A=n→∞limi=1∑nf(ξi)Δxi,xi−1<ξi<xi定义为曲边梯形的面积。
积分的基本思想就是“无限求和”,需要尽可能地将每一个矩形的底边分割成无穷小,这样所求的结果即为曲边梯形的面积。数学家莱布尼茨为了体现求和的感觉,将 Sum 中的第一个字母 s 拉长了,简写成
S u m [ f ( x ) Δ x ] ⇒ ∫ u m f ( x ) d x Sum\left [ f(x)\Delta x \right ]\Rightarrow \int_{um}^{}f(x)dx Sum[f(x)Δx]⇒∫umf(x)dx就成了常见的积分符号 ∫ \int ∫。
下面再来讨论一个问题:求变速直线运动的路程。
设某物体做直线运动,已知速度 ν = ν ( t ) ν=ν(t) ν=ν(t) 是时间间隔 [ t 1 , t 2 t_{1}, t_{2} t1,t2] 上 t t t 的连续函数,且 v ( t ) ⩾ 0 v(t)\geqslant0 v(t)⩾0,计算在这段时间内物体所经过的路程。
匀速直线运动的公式:路程=速度 x 时间。但是在我们的问题中,速度不是常数,而是随时间变化的变量,因此所求路程 s 不能直接按匀速直线运动的路程公式来计算。物体运动的速度函数 ν = ν ( t ) ν=ν(t) ν=ν(t) 是连续变化的,在很短的时间内,速度的变化很小,因此如果把时间间隔分小,在小段时间内,以匀速运动近似代替变速运动,就可以算出各部分路程的近似值,再求和得到整个路程的近似值,最后,通过对时间间隔无限细分的极限过程,求得物体在时间间隔 [ t 1 , t 2 t_{1}, t_{2} t1,t2] 内的路程结果如下。
s = lim n → ∞ ∑ i = 1 n v ( ξ i ) Δ t i , t i − 1 < ξ i < t i s=\lim_{n\rightarrow \infty }\sum_{i=1}^{n}v\left ( \xi _{i} \right )\Delta t_{i},\: t_{i-1}< \xi _{i} < t_{i} s=n→∞limi=1∑nv(ξi)Δti,ti−1<ξi<ti
根据前面两个实际问题分析可以看出,尽管所要计算的量的实际意义各不相同,但计算方法与步骤都是相同的,可归结为具有相同结构的特定格式的极限,即定积分。
在区间 [ a a a, b b b] 上,当 f ( x ) > 0 f(x)>0 f(x)>0 时,定积分 ∫ a b f ( x ) d x \int_{a}^{b}f(x)dx ∫abf(x)dx 的值为正数;当 f ( x ) < 0 f(x)<0 f(x)<0 时,定积分 ∫ a b f ( x ) d x \int_{a}^{b}f(x)dx ∫abf(x)dx 的值为负数。图6中, ∫ a b f ( x ) d x \int_{a}^{b}f(x)dx ∫abf(x)dx 的值为各阶段正负值的代数和。
【例1】利用定义计算定积分 ∫ 0 1 x 2 d x \int_{0}^{1}x^{2}dx ∫01x2dx。
性质1 函数的和(差)的定积分等于它们的定积分的和(差),即
性质2 被积函数的常数因子可以提到积分号外面,即
性质3 如果将积分区间分成两部分,则在整个区间上的定积分等于这两部分区间上定积分之和 ,即设 a < c < b a
a<c<b ,则
性质4 如果在区间 [ a a a, b b b] 上, f ( x ) ≥ 0 f(x)\geq 0 f(x)≥0,则
性质5 如果在区间 [ a a a, b b b] 上, f ( x ) = 1 f(x) = 1 f(x)=1,则
推论1 如果在区间 [ a a a, b b b] 上, f ( x ) ≥ g ( x ) f(x) \geq g(x) f(x)≥g(x),则
推论2 在区间 [ a a a, b b b] 上,
性质6 定积分中值定理:如果函数 f ( x ) f(x) f(x) 在闭区间 [ a a a, b b b]上连续 ,则在积分区间 [ a a a, b b b]上至少存在一点 ξ \xi ξ,使下式成立:
∫ a b f ( x ) d x = f ( ξ ) ( b − a ) , a ⩽ ξ ≤ b \int_{a}^{b}f(x)dx=f(\xi )(b-a),\: a\leqslant \xi \leq b ∫abf(x)dx=f(ξ)(b−a),a⩽ξ≤b这个公式叫作积分中值公式。
如图 7 所示,积分中值公式的几何解释:在区间[ a a a, b b b]上至少存在一点 ξ \xi ξ 使以区间 [ a a a, b b b]为底边、以曲线 y = f ( x ) y=f(x) y=f(x) 为曲边的曲边梯形的面积等于同一底边而高为 f ( ξ ) f(\xi) f(ξ) 的矩形的而积。
在机器学习应用中, 定积分的计算可以利用计算器及科学计算库来直接求解。
前面介绍了定积分的定义和性质,但并未给出定积分有效的计算方法。在例 1 中利用定义计算定积分非常麻烦,因此必须寻求计算定积分的新方法。在此将建立定积分和不定积分之间的关系,这个关系为定积分的计算提供了高效的方法。
设函数 f ( x ) f(x) f(x) 在区间 [ a a a, b b b] 上连续,则对于任意点 x ϵ x\epsilon xϵ[ a a a, b b b], 函数 f ( x ) f(x) f(x)在 [ a a a, x x x] 上仍然连续,定积分 ∫ a x f ( x ) d x \int_{a}^{x}f(x)dx ∫axf(x)dx 一定存在。在这个定积分中, x x x 既表示积分上限,又表示积分变量。由于积分值与积分变量的记法无关,可将积分变量改用其他符号表示,如用 t t t 表示,则上面的积分可表示为 ∫ a x f ( t ) d t \int_{a}^{x}f(t)dt ∫axf(t)dt。
如果上限 x x x 在区间 [ a a a, b b b]上任意变动,则对每一个取定的 x x x,定积分有确定的值与之对应。 所以在 [ a a a, b b b]上定义一个函数,记为 Φ ( x ) \Phi (x) Φ(x) ,则
函数 Φ ( x ) \Phi (x) Φ(x) 是积分上限 x x x 的函数,也称为 f ( t ) f(t) f(t) 的变上限积分。 Φ ( x ) \Phi (x) Φ(x) 具有以下重要性质。
定理1 如果函数 f ( x ) f(x) f(x) 在区间 [ a a a, b b b] 上连续,则积分上限函数 Φ ( x ) = ∫ a x f ( t ) d t \Phi (x)=\int_{a}^{x}f(t)dt Φ(x)=∫axf(t)dt 在[ a a a, b b b] 上可导,且
Φ ′ ( x ) = d d x ∫ a x f ( t ) d t = f ( x ) \Phi ^{'}(x)=\frac{\mathrm{d} }{\mathrm{d} x}\int_{a}^{x}f(t)dt=f(x) Φ′(x)=dxd∫axf(t)dt=f(x)
另外,若函数 f ( x ) f(x) f(x) 在区间 [ a a a, b b b] 上连续,则称函数 Φ ( x ) = ∫ x b f ( t ) d t , a ≤ x ≤ b \Phi (x)=\int_{x}^{b}f(t)dt,\: a\leq x\leq b Φ(x)=∫xbf(t)dt,a≤x≤b 为 f ( x ) f(x) f(x) 在区间 [ a a a, b b b] 上的积分下限函数,由定理1可得:
定理2 原函数存在定理:若函数 f ( x ) f(x) f(x) 在区间 [ a a a, b b b] 上连续,则函数 Φ ( x ) = ∫ a x f ( t ) d t \Phi (x)=\int_{a}^{x}f(t)dt Φ(x)=∫axf(t)dt 就是 f ( x ) f(x) f(x) 在区间 [ a a a, b b b] 上的一个原函数。
【例2】求 d d x ( ∫ 0 x s i n 2 ( t ) d t ) \frac{\mathrm{d} }{\mathrm{d} x}\left ( \int_{0}^{x}sin^{2}\left ( t \right )dt \right ) dxd(∫0xsin2(t)dt)。
解:由定理1可得:
d d x ( ∫ 0 x s i n 2 ( t ) d t ) = s i n 2 ( x ) \frac{\mathrm{d} }{\mathrm{d} x}\left ( \int_{0}^{x}sin^{2}\left ( t \right )dt \right )=sin^{2}\left ( x \right ) dxd(∫0xsin2(t)dt)=sin2(x)
定理1揭示了原函数与定积分的内在联系,由此可以导出一个重要定理,它给出用原函数计算定积分的公式。
定理3 设函数 f ( x ) f(x) f(x) 在区间 [ a a a, b b b] 上连续, F ( x ) F(x) F(x) 是 f ( x ) f(x) f(x) 在 [ a a a, b b b] 上的一个原函数,则
∫ a b f ( x ) d x = F ( b ) − F ( a ) \int_{a}^{b}f(x)dx = F(b)-F(a) ∫abf(x)dx=F(b)−F(a)通常称此公式为微积分基本公式或牛顿-莱布尼茨公式。
在前面已经提到,积分是在确定函数的导数的基础上,通过一定的数学方法对原函数进行求解的过程。积分的基本思想是通过微分的 “无限求和” 来进行的。微分是对函数的求导过程,于是又可以将积分看成是微分的一个逆向过程。
设函数 y = f ( x ) y=f(x) y=f(x), 把区间 [ a a a, b b b] 均分为 4 份,如图 8(a) 所示,整体等于部分之和,即 f ( b ) − f ( a ) = ∑ Δ y f(b)-f(a)=\sum_{}^{}\Delta y f(b)−f(a)=∑Δy。继续细分,如图 8(b) 所示,把区间均分到最细,即间隔为 d x dx dx,对应的 Δ y \Delta y Δy 也变成了 d y dy dy, 所以 f ( b ) − f ( a ) = ∑ d y f(b)-f(a)=\sum_{}^{}dy f(b)−f(a)=∑dy。 根据微分的无限细分可知 d y = f ′ ( x ) d x dy = f^{'}(x)dx dy=f′(x)dx, 因此 f ( b ) − f ( a ) = ∑ f ′ ( x ) d x = ∫ a b f ′ ( x ) d x f(b)-f(a)=\sum_{}^{}f^{'}(x)dx=\int_{a}^{b}f^{'}(x)dx f(b)−f(a)=∑f′(x)dx=∫abf′(x)dx 。 由牛顿一莱布尼茨公式可知, f ( x ) f(x) f(x) 为 f ′ ( x ) f'(x) f′(x) 的原函数。
这个公式进一步揭示了定积分与被积函数的原函数或不定积分之间的关系,为定积分提供了 一个有效而简便的计算方法。但是,需要注意:该公式的前提是原函数存在。
图9通俗地表示了牛顿一莱布尼茨公式的意义。
【例3】
【例4】
【例5】计算由曲线 y = x 2 y = x^{2} y=x2 和直线 y = x − 4 y=x-4 y=x−4 所围成的图形的面积 S, 如图 10 所示。
【例6】应用SciPy科学计算库计算 ∫ 0 3 c o s 2 ( e x ) d x \int_{0}^{3}cos^{2}\left ( e^{x} \right )dx ∫03cos2(ex)dx。
解:本例题使用了 SciPy科学计算库的 q u a d quad quad 函数,它的一般形式是 s c i p y . i n t e g r a t e . q u a d ( f , a , b ) scipy.integrate.quad(f, a, b) scipy.integrate.quad(f,a,b),其中 f f f 是要积分的函数名称, a a a 和 b b b 分别是下限和上限 。
【代码如下】
import numpy as np
from scipy.integrate import quad
func = lambda x: np.cos(np.exp(x))**2 # 定义被积分函数
solution = quad(func, 0, 3) # 调用 quad 积分函数
print(solution)
【结果说明】
输出结果: ( 1.296467785724373 , 1.3977971853986262 e − 09 ) (1.296467785724373, 1.3977971853986262e-09) (1.296467785724373,1.3977971853986262e−09),前一个为积分值,后一个为误差。
【例7】应用SciPy科学计算库计算 ∬ D e − x 2 − y 2 d x d y \iint_{D}^{}e^{-x^{2}-y^{2}}dxdy ∬De−x2−y2dxdy,其中 D = { ( x , y ) ∣ 0 ≤ x ≤ 10 , 0 ≤ y ≤ 10 } D=\left \{ \left ( x,y \right )\mid 0\leq x\leq 10,\: 0\leq y\leq 10 \right \} D={ (x,y)∣0≤x≤10,0≤y≤10}。
解:dblquad 函数的一般形式是 scipy.integrate.dblquad(func, a, b, gfun,hfun)。 其中,func 是要积分的函数名称, a a a 和 b b b 分别是变量 x x x 的下限和上限, gfun 和 hfun 是定义变量 y y y 的下限和上限的函数名称。请注意,即使 gfun 和 hfun 是常数,它们在很多情况下也必须定义为函数。 例如本题 0 ≤ y ≤ 10 0\leq y\leq 10 0≤y≤10,即使 y y y 的下限和 y y y 的上限为常数,也要定义函数为 gfun(x)=0 和 hfun(x)=10。本题函数 gfun(x)、hfun(x) 的表达形式为 lambda x: y_a 和 lambda x: y_b,其中 y_a 、 y_b 的值分别为 0 和 10。
【代码如下】
import numpy as np
from scipy.integrate import dblquad
def integrand(x, y):
return np.exp(-x**2-y**2)
x_a = 0
x_b = 10
y_a = 0
y_b = 10
solution, abserr = dblquad(integrand, x_a, x_b, lambda x: y_a, lambda x: y_b)
print(solution, abserr)
【结果说明】
输出结果: ( 0.78539816339744761.3753098510218537 e − 08 ) (0.7853981633974476 1.3753098510218537e-08) (0.78539816339744761.3753098510218537e−08),前一个为积分值,后一个为误差。
以上采用 SciPy 科学计算库中的数值积分函数直接求解定积分,下面通过定积分定义的基本概念,编程模拟实现求解定积分。
从第5部分内容可知,函数 f ( x ) f(x) f(x) 在区间 [ a a a, b b b] 上连续,且其原函数为 F ( x ) F(x) F(x),则可用牛顿一莱布尼茨公式 ∫ a b f ( x ) d x = F ( b ) − F ( a ) \int_{a}^{b}f(x)dx = F(b)-F(a) ∫abf(x)dx=F(b)−F(a) 求定积分的值。牛顿一莱布尼茨公式无论在理论上还是在解决实际问题上都具有重要作用,但它并不能完全解决定积分的计算问题,有些情况它就无能为力,例如,被积函数的原函数很难用初等函数表达出来、原函数存在但表达式太复杂 、 被积函数没有具体的解析表达式 、 函数关系由表格或图形表示等。 这些情况下,积分并不十分准确。因此,利用原函数求积分具有局限性。
根据定积分的定义
∫ a b f ( x ) d x = lim λ → 0 ∑ i = 1 n f ( ξ i ) Δ x i \int_{a}^{b}f(x)dx=\lim_{\lambda \rightarrow 0 }\sum_{i=1}^{n}f\left ( \xi _{i} \right )\Delta x_{i} ∫abf(x)dx=λ→0limi=1∑nf(ξi)Δxi 可知,定积分的求解过程大致分为以下4个步骤:
上面的求解过程为使用计算机求解定积分提供了算法思路。将求积区间进行 n n n 等分,步长为 b − a n \frac{b-a}{n} nb−a,循环 n n n 次求解 n n n 个小梯形面积之和,结果即为定积分近似解。
【例8】应用 Python 编程实现求定积分近似解,并用例 6 进行验证。
【代码如下】
from numpy import *
a, b = 0, 3
def f(x):
return cos(exp(x))**2
# 数值计算 --- 求解定积分的一种算法
def trape(n):
h = (b-a)/n
x = a
sum = 0
for i in range(1, n):
x2 = a+i*h
sum = sum+(f(x)+f(x2))*h/2
x = x2
return sum
print(trape(10))
print(trape(100))
print(trape(1000))
print(trape(10000))
print(trape(100000))
【结果说明】
0.944822326405313
1.2843391540917448
1.2960750567338157
1.296434741500134
1.2964645400078032
从结果可以看出,当积分区间分为100000等份时,定积分的值为1.2964645400078032,与例6的结果近似。本例求定积分的算法过程来源于最基本的定积分数学描述原理,并运用 Python 编程实现,经过实例验证,定积分求解结果达到要求。在本例中积分区间还可以继续细分,直到结果值基本不再变化时,可以达到更高的精确度。
SciPy 提供了 一系列不同类型的求积函数,它们中的大多数都在同一个 scipy.integrate 库中 。表1列出了数值积分常用函数。