1.函数的连续性
1.1.函数在单点处的连续性
从这一讲开始,我们正式进入到微积分的部分中来。我们首先从函数的连续性开始讨论,然后逐步过渡到切线和导数的概念。
函数
f
(
x
)
f(x)
f(x)在具体的取值点
c
c
c点是否连续,我们针对性的来看下面三幅图中的具体情形:
在这幅图中,我们发现在点 c c c处,函数的左极限和右极限不相等,即 l i m x → c − f ( x ) ≠ l i m x → c + f ( x ) lim_{x\rightarrow c^{-}}f(x) \neq lim_{x\rightarrow c^{+}}f(x) limx→c−f(x)=limx→c+f(x),因此 l i m x → c f ( x ) lim_{x\rightarrow c}f(x) limx→cf(x)不存在, c c c点处函数的极限不存在,因此函数 f ( x ) f(x) f(x)在点 c c c处不连续。
这幅图中情况似乎要稍微好点儿,我们发现
l
i
m
x
→
c
−
f
(
x
)
=
l
i
m
x
→
c
+
f
(
x
)
lim_{x\rightarrow c^{-}}f(x)=lim_{x\rightarrow c^{+}}f(x)
limx→c−f(x)=limx→c+f(x),函数
f
(
x
)
f(x)
f(x)在
c
c
c点处的极限是存在的,但是从图中可以看出,函数的极限值和
c
c
c点处函数的实际取值不相等,即:
l
i
m
x
→
c
f
(
x
)
≠
f
(
c
)
lim_{x\rightarrow c}f(x) \neq f(c)
limx→cf(x)=f(c),因此函数
f
(
x
)
f(x)
f(x)在点
c
c
c处仍然不连续。
这幅图中以上出现的两个问题都不存在了,我们看到:一方面函数 f ( x ) f(x) f(x)的极限是存在的,而另一方面 l i m x → c f ( x ) = f ( c ) lim_{x\rightarrow c}f(x)=f(c) limx→cf(x)=f(c),点 c c c处的极限和函数的取值又是相等的,因此在这幅图中,函数 f ( x ) f(x) f(x)在点 c c c处是连续的。
那么,依照严格的定义,对于一个定义在包含点 c c c的区间上的函数 f ( x ) f(x) f(x),如果 l i m x → c f ( x ) = f ( c ) lim_{x\rightarrow c}f(x)=f(c) limx→cf(x)=f(c)成立,则称函数 f f f在点 c c c处连续。
1.2.函数在区间上的连续性
进一步扩展到区间上,如果函数 f ( x ) f(x) f(x)在开区间上的任意一点连续,那么这个函数 f ( x ) f(x) f(x)就在整个这个开区间上连续。
如果谈到闭区间 [ a , b ] [a,b] [a,b]上的连续性问题,那么就需要着重单独讨论区间的左右两个端点:我们首先从右侧逼近左侧端点 a a a,如果 l i m x → a + f ( x ) = f ( a ) lim_{x\rightarrow a^{+}}f(x) =f(a) limx→a+f(x)=f(a)成立,则称函数 f ( x ) f(x) f(x)在端点 a a a上右连续,我们再从左侧逼近右侧端点 b b b,即 l i m x → b − f ( x ) = f ( b ) lim_{x\rightarrow b^{-}}f(x) =f(b) limx→b−f(x)=f(b)成立,则称函数 f ( x ) f(x) f(x)在端点 b b b上右连续。
那么,如果函数在开区间 ( a , b ) (a,b) (a,b)上连续,且在左侧端点 a a a上右连续,在右侧端点 b b b上左连续,此时此刻,我们就能够说函数 f ( x ) f(x) f(x)在闭区间 [ a , b ] [a,b] [a,b]上是连续的。
2.关于切线
切线是一个大家都非常熟悉的概念,什么是切线?有一种说法是一条曲线的切线只与这条曲线有一个交点。这个概念有很大的局限性,他只对圆环类的曲线有效,而对例如下面的这条曲线,描述显然就不适用了:
实际上,在上面这幅图中,直线显然是曲线在 P P P点处的切线,但是更明显的是,这条直线与曲线的交点数不止一个。那么我们应该怎样更准确的描述切线呢?这里就要用到极限的概念:
我们还是看曲线上 P P P点的切线:我们假定 Q Q Q点为曲线上一个接近 P P P点的可动点,经过 P P P点和 Q Q Q点的直线叫做割线,在 P P P点的切线就是当 Q Q Q点沿曲线向 P P P点移动时,割线的极限位置,如下图所示:
因此,结合上面这幅图,我们来总结一下切线的严格定义:
已知的任意一条曲线 y = f ( x ) y=f(x) y=f(x)在点 P ( c , f ( c ) ) P(c,f(c)) P(c,f(c))处的切线就是穿过该点 P P P的一条直线,且这条直线的斜率为 l i m h → 0 f ( c + h ) − f ( c ) h lim_{h\rightarrow 0} \frac{f(c+h)-f(c)}{h} limh→0hf(c+h)−f(c)。当然,这里有个前提条件,那就是表示斜率的这个极限存在且不为 ∞ \infty ∞或 − ∞ -\infty −∞。
3.导数的介绍
3.1.从切线到导数
切线的概念很简单,我们也非常熟悉,这里我们不做过多的停留。下面我们进入到导数概念的介绍,导数的定义和斜率其实看上去很像:
函数 f f f的导数我们将其记作 f ′ f' f′,其实他是另外一个函数,导数对定义域内任意自变量 x x x的函数值为: f ′ ( x ) = l i m h → 0 f ( x + h ) − f ( x ) h f'(x)=lim_{h\rightarrow 0}\frac{f(x+h)-f(x)}{h} f′(x)=limh→0hf(x+h)−f(x),如果这个极限存在,那么我们就说函数 f f f在 x x x点处可微,而这个求导的过程就叫作微分。
当然,导数的定义式还有另一种等价的形式:
f ′ ( c ) = l i m x → c f ( x ) − f ( c ) x − c f'(c)=lim_{x\rightarrow c}\frac{f(x)-f(c)}{x-c} f′(c)=limx→cx−cf(x)−f(c)
3.2.可微一定连续
这短短的定义式里,其实有很多坑等着我们,最主要的就是分析可微和连续之间的关系:
首先,可微性一定能够推出连续性,说具体点就是:如果函数的导数 f ′ ( c ) f'(c) f′(c)存在,那么函数 f f f在点 c c c处就是连续的。这个概念我们简单推导一下,大家就能够明白了:
首先对函数 f ( x ) f(x) f(x)做一个简单的基本变形:
f ( x ) = f ( c ) + f ( x ) − f ( c ) = f ( c ) + f ( x ) − f ( c ) x − c ⋅ ( x − c ) f(x)=f(c)+f(x)-f(c)=f(c)+\frac{f(x)-f(c)}{x-c}\cdot (x-c) f(x)=f(c)+f(x)−f(c)=f(c)+x−cf(x)−f(c)⋅(x−c),此时 x ≠ c x \neq c x=c
此时, x ≠ c x\neq c x=c,对于上面的变形当然是成立的。那么,当 x → c x\rightarrow c x→c时,即 x x x不断逼近于 c c c的时候,等式的左右两侧也是相等的,对应的就是两侧同时取极限:
l i m x → c f ( x ) = l i m x → c [ f ( c ) + f ( x ) − f ( c ) x − c ⋅ ( x − c ) ] lim_{x\rightarrow c}f(x)=lim_{x\rightarrow c}[f(c)+\frac{f(x)-f(c)}{x-c}\cdot (x-c)] limx→cf(x)=limx→c[f(c)+x−cf(x)−f(c)⋅(x−c)] = l i m x → c f ( c ) + l i m x → c f ( x ) − f ( c ) x − c ⋅ l i m x → c ( x − c ) =lim_{x\rightarrow c}f(c)+lim_{x\rightarrow c}\frac{f(x)-f(c)}{x-c}\cdot lim_{x\rightarrow c}(x-c) =limx→cf(c)+limx→cx−cf(x)−f(c)⋅limx→c(x−c)
仔细观察一下这个等式中的三部分,其中:
f ( c ) f(c) f(c)是一个与变量 x x x取值无关的常数,因此 l i m x → c f ( c ) = f ( c ) lim_{x\rightarrow c}f(c)=f(c) limx→cf(c)=f(c)。
而 l i m x → c f ( x ) − f ( c ) x − c lim_{x\rightarrow c}\frac{f(x)-f(c)}{x-c} limx→cx−cf(x)−f(c)就是导数 f ′ ( c ) f'(c) f′(c)的定义式,而我们前面说了前提条件是导数 f ′ ( c ) f'(c) f′(c)存在,因此 l i m x → c f ( x ) − f ( c ) x − c = f ′ ( c ) lim_{x\rightarrow c}\frac{f(x)-f(c)}{x-c} = f'(c) limx→cx−cf(x)−f(c)=f′(c)
而最后一个很明显, l i m x → c ( x − c ) = 0 lim_{x\rightarrow c}(x-c)=0 limx→c(x−c)=0
因此,最终就有:
l i m x → c f ( x ) = l i m x → c f ( c ) + l i m x → c f ( x ) − f ( c ) x − c ⋅ l i m x → c ( x − c ) lim_{x\rightarrow c}f(x)=lim_{x\rightarrow c}f(c)+lim_{x\rightarrow c}\frac{f(x)-f(c)}{x-c}\cdot lim_{x\rightarrow c}(x-c) limx→cf(x)=limx→cf(c)+limx→cx−cf(x)−f(c)⋅limx→c(x−c) = f ( c ) + f ′ ( c ) ⋅ 0 = f ( c ) =f(c)+f'(c)\cdot 0=f(c) =f(c)+f′(c)⋅0=f(c)
我们只看一头一尾,即: l i m x → c f ( x ) = f ( c ) lim_{x\rightarrow c}f(x)=f(c) limx→cf(x)=f(c),函数在 c c c点处这不就连续了吗。
3.3.连续不一定可微
那反过来呢?很多地方最爱区分的概念就是连续一定可微吗?也就是说函数 f ( x ) f(x) f(x)在 c c c点处连续,那么导数 f ′ ( c ) f'(c) f′(c)一定存在吗?答案是不一定,我们看几个简单的例子。
首先,我们用这个函数来证明:
y
=
∣
x
∣
y=|x|
y=∣x∣。
在 x = 0 x=0 x=0点处函数显然是连续的,那么函数在这个点的导数存在吗?我们直接扣定义,写出导数的定义式:
f ′ ( 0 ) = l i m h → 0 ∣ 0 + h ∣ − ∣ 0 ∣ h = l i m h → 0 ∣ h ∣ h f'(0)=lim_{h\rightarrow 0}\frac{|0+h|-|0|}{h}=lim_{h\rightarrow 0} \frac{|h|}{h} f′(0)=limh→0h∣0+h∣−∣0∣=limh→0h∣h∣
这里,当 h h h从右侧逼近 0 0 0的时候:即 l i m h → 0 + ∣ h ∣ h = h h = 1 lim_{h\rightarrow 0^{+} } \frac{|h|}{h} = \frac{h}{h}=1 limh→0+h∣h∣=hh=1
而当 h h h从左侧逼近 0 0 0的时候,即 l i m h → 0 − ∣ h ∣ h = − h h = − 1 lim_{h\rightarrow 0^{-} } \frac{|h|}{h} = \frac{-h}{h} = -1 limh→0−h∣h∣=h−h=−1
此时我们发现左极限和右极限不相等,因此极限 l i m h → 0 f ( 0 + h ) − f ( 0 ) h lim_{h\rightarrow 0} \frac{f(0+h)-f(0)}{h} limh→0hf(0+h)−f(0)不存在,换句话说,函数在 0 0 0处的导数 f ′ ( 0 ) f'(0) f′(0)不存在。
从中我们受到启发并进行拓展,一个连续函数在它的图形中有任何尖锐拐角的地方都是不可导的。
如果函数不是这种尖峰形状的,而是光滑的,那又是什么情形呢?
我们再看另一个例子: y = x 1 3 y=x^{\frac{1}{3}} y=x31,显然他在点 x = 0 x=0 x=0的地方是光滑且连续的,但是他的导数为 f ′ ( x ) = 1 3 x − 2 3 = 1 3 x 2 3 f'(x)=\frac{1}{3}x^{-\frac{2}{3}}=\frac{1}{3x^{\frac{2}{3}}} f′(x)=31x−32=3x321,此时我们发现: l i m x → 0 = 1 3 x 2 3 = ∞ lim_{x\rightarrow 0}=\frac{1}{3x^{\frac{2}{3}}}=\infty limx→0=3x321=∞,因此,函数在点 0 0 0处不可导。
连续与可微的概念希望大家能够通过上面的几个小例子加深概念。
4.一些导数的基本记号
最后,我们来看看导数的一些记号,方便我们在后续的讨论中使用:
首先如果自变量 x x x的值从 x 1 x_1 x1改变到 x 2 x_2 x2,那么 x 2 − x 1 x_2-x_1 x2−x1就叫作 x x x的增量,我们把他记作是 Δ x \Delta x Δx。
相应的,函数的取值 y y y也从 f ( x 1 ) f(x_1) f(x1)变到了 f ( x 2 ) f(x_2) f(x2),那么相应 y y y的增量为: Δ y = y 2 − y 1 = f ( x 2 ) − f ( x 1 ) \Delta y=y_2-y_1=f(x_2)-f(x_1) Δy=y2−y1=f(x2)−f(x1)
因此,假设自变量从 x x x变化到 x + Δ x x+\Delta x x+Δx,相应的增量比为: Δ y Δ x = f ( x + Δ x ) − f ( x ) Δ x \frac{\Delta y}{\Delta x}=\frac{f(x+\Delta x)-f(x)}{\Delta x} ΔxΔy=Δxf(x+Δx)−f(x)。
当 Δ x → 0 \Delta x\rightarrow 0 Δx→0时,我们也可以用下面的符号来记作其导数:
d y d x = l i m Δ x → 0 Δ y Δ x = l i m Δ x → 0 f ( x + Δ x ) − f ( x ) Δ x = f ′ ( x ) \frac{dy}{dx}=lim_{\Delta x\rightarrow 0}\frac{\Delta y}{\Delta x}=lim_{\Delta x\rightarrow 0}\frac{f(x+\Delta x)-f(x)}{\Delta x}=f'(x) dxdy=limΔx→0ΔxΔy=limΔx→0Δxf(x+Δx)−f(x)=f′(x)。
而像一些函数的基本求导法则,高阶导数的求导法则等基础知识,我们就不在课程中过多赘述了,大家可以参照手头的微积分教材进行复习巩固。
5.基于python的数值微分法
那么在实际的程序中,我们如何来求取函数的导数值呢?很显然,紧扣定义就好了。
接下来我们参照定义式 d y d x = l i m h → 0 f ( x + h ) − f ( x ) h \frac{dy}{dx} =lim_{h\rightarrow 0}\frac{f(x+h)-f(x)}{h} dxdy=limh→0hf(x+h)−f(x),让 h h h取一个非常小的值,利用python来实现函数导数的求取。
但是实际上,在用数值法求近似的导数值的时候,还可以使用中心差分法,这样求得的导数会更接近于真实值,中心差分法求导的定义式为: d y d x = l i m h → 0 f ( x + h 2 ) − f ( x − h 2 ) h \frac{dy}{dx}=lim_{h\rightarrow 0}\frac{f(x+\frac{h}{2})-f(x-\frac{h}{2})}{h} dxdy=limh→0hf(x+2h)−f(x−2h)。
中心差分法本质上还是建立在割线的极限是切线的思想,为什么说实际操作时,中心差分法更接近于真实的导数值呢?我们看一个示意图:
从图中可以看出,用中心差分法所做割线的斜率要比普通定义法更接近于真实切线的斜率。
最后,我们用代码来实际进行导数的数值法求解,我们举一个简单的函数 f ( x ) = x 2 f(x)=x^2 f(x)=x2,他的导数很简单 f ′ ( x ) = 2 x f'(x)=2x f′(x)=2x,我们比较在 x = 4 x=4 x=4时,两种方法求出的导数数值近似解,以及和真实值 8 8 8之间的差距:
代码片段:
def function(x):
return x*x
def numerical_diff(f, x):
h = 1e-4
return (f(x+h) - f(x))/h
def numerical_diff_1(f, x):
h = 1e-4
return (f(x+h/2) - f(x-h/2))/h
print('theoretical value={}'.format(2*4))
print('value={},error={}'.format(numerical_diff(function, 4),abs(numerical_diff(function, 4)-8)))
print('value={},error={}'.format(numerical_diff_1(function, 4),abs(numerical_diff_1(function, 4)-8)))
运行结果:
theoretical value=8
value=8.00009999998963,error=9.999998962939571e-05
value=7.999999999963592,error=3.6408209780347534e-11
从运行结果中我们可以看出,函数 f ( x ) = x 2 f(x)=x^2 f(x)=x2在 x = 4 x=4 x=4处的导数理论值为 8 8 8,数值求导过程中,定义法求出的导数近似值为: 8.00009999998963 8.00009999998963 8.00009999998963,中心差分法求得的导数近似值为: 7.999999999963592 7.999999999963592 7.999999999963592,很明显,中心差分法求得的导数近似值更接近于真实的理论值。