【Python讲优化】S06E03 详解多元函数和偏导数的概念

1.函数:从一元到多元

在前面的两讲内容中,我们所介绍的函数都只有一个自变量,而从这一讲开始,我们关心和感兴趣的是含多个实数自变量的实值函数。例如,对于二元函数而言,就是在某平面集合$D$内任给有序变量$(x,y)$,能够确定唯一的实数$f(x,y)$,例如:

$f(x,y)=\sqrt{x^2+y^2}$

$f(x,y)=y^2-x^2$

一般我们也将其写作:$z=\sqrt{x^2+y^2}$,以及$z=y^2-x^2$。因此我们称$x$,$y$为函数的自变量,$z$为函数的因变量。

2.二元函数的可视化

2.1.函数图像的绘制

下面,我们来实践一下如何利用$python$来绘制三维曲面:$z=x-\frac{1}{9}x^3-\frac{1}{2}y^2$。

代码片段:

from matplotlib import pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = Axes3D(fig)

x = np.arange(-4, 4, 0.01)
y = np.arange(-4, 4, 0.01)
x, y = np.meshgrid(x, y)
z = x-(1./9)*x**3-(1./2)*y**2

ax.plot_surface(x, y, z, cmap=plt.cm.Blues_r)
plt.show()

运行结果:

图1.二元函数的图像

图1.二元函数的图像

2.2.等高线图的绘制

在三维图形的绘图中,还有一种呈现三维图形性质的表示方法,那就是等高线图。等高线图大家不会陌生,他的定义是,利用每一个水平面$z=c$与函数图形表面相交于一条曲线,然后将所有的这些曲线投影到$xoy$平面上,就得到不同高度(也就是$z=f(x,y)$)取值的等高线集合,即构成了这个三维图形的等高线图。

我们下面接着来绘制上面这幅三维图像的等高线图:

代码片段:

import numpy as np
import matplotlib.pyplot as plt

def f(x, y):
    return x-(1./9)*x**3-(1./2)*y**2

x = np.arange(-4, 4, 0.01)
y = np.arange(-4, 4, 0.01)

#把x,y数据生成mesh网格状的数据
X, Y = np.meshgrid(x, y)

#填充等高线间的颜色
plt.contourf(X, Y, f(X, Y), 24, cmap=plt.cm.hot)
#添加等高线
C = plt.contour(X, Y, f(X, Y), 24)
#增加各等高线的高度值
plt.clabel(C, inline=True, fontsize=12)

plt.show()

运行结果:
图2.二元函数的等高线图

图2.二元函数的等高线图

我们这里简单的解释一下这段代码:

在函数$plt.contour$当中,$24$表示的是我们使用的等高线的数量,数字越大,等高线越多

通过函数$plt.contourf$,在等高线之间填充不同的颜色以示区分,其中,$cmap=plt.cm.hot$表示我们的等高线集合使用热力图的颜色集,颜色越浅表示函数值越大,就和火焰温度和火焰颜色的关系一样。

3.多元函数的偏导数

3.1.概念的引入

我们在前面已经介绍过一元函数的导数,那么从一元变量过渡到多元变量之后,导数又该如何定义?

假如函数$f(x,y)$是关于$x$和$y$两个变量的函数,我们在讨论导数概念的时候需要固定一个变量再去讨论另外一个变量。例如,我们需要先将$y$固定为一个常数$y=y_0$,此时$f(x,y_0)$实际上就变成了一个只有单个变量$x$的函数,那么他在$x=x_0$处的导数称为是$f$关于$x$在$(x_0,y_0)$处的偏导数,被记作是:$f_x(x_0,y_0)$。

那么按照我们之前利用极限来定义导数的式子进行迁移拓展,我们很容易得到偏导数的定义式,即:$f_x(x_0,y_0)=lim_{\Delta x\rightarrow 0}\frac{f(x_0+\Delta x,y_0)-f(x_0,y_0)}{\Delta x}$

那么同样的,函数$f(x,y)$关于$y$在$(x_0,y_0)$处的偏导数,记作是:

$f_y(x_0,y_0)=lim_{\Delta y\rightarrow 0}\frac{f(x_0,y_0+\Delta y)-f(x_0,y_0)}{\Delta y}$

和导数中的线性算子$\frac{d}{dx}$类似,偏导数中也有自己的特色符号$\partial$,那么$\frac{\partial}{\partial x}$和$\frac{\partial}{\partial y}$则分别表示对$x$和$y$求偏导的线性算子。

那么,针对多元函数$z=f(x,y)$,下面的这一系列描述都是等效的:$f_x(x,y)=\frac{\partial z}{\partial x}=\frac{\partial f(x,y)}{\partial x}$。

针对$(x_0,y_0)$的具体取值$f_x(x_0,y_0)$,则可以记作是$f_x(x_0,y_0)=\frac{\partial z}{\partial x}|_{(x_0,y_0)}$

关于$y$的偏导数也是同理,这里就不再赘述了。

3.2.偏导数的几何意义

下面我们来探讨一下偏导数的几何意义。我们还是来看$z=x-\frac{1}{9}x^3-\frac{1}{2}y^2$这个二元函数,来研究一下$\frac{\partial z}{\partial x}$。请大家记住,在求关于变量$x$的偏导数时,$y$就是一个与变量$x$无关的常数。

结合下面的代码和示意图来看$f_x(x_0,y_0)$的几何含义。在代码例子中,我们实际举例$x_0=3,y_0=-2$,首先,我们让$y=-2$这个橙色的垂直平面与整个蓝色曲面相交,形成曲面表面那条红色的相交曲线,也就是说这条红色曲线既在表示原函数的蓝色曲面上,也在平行于$xoz$平面的橙色平面$y=-2$上。

我们过点$(x_0,y_0,f(x_0,y_0))$,在图中就是那个位于$(3,-2,-2)$的黑色点,做红色曲线的切线。那么最终原函数$z$关于$x$的偏导数的取值:$f_x(3,-2)$就是这条切线的斜率,需要注意的是,这条切线同样也在垂直平面$y=-2$中,与$xoz$平面平行。

代码片段:
```
from matplotlib import pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = Axes3D(fig)

多元函数z=f(x,y)

def f(x, y):
return x-(1./9)x3-(1./2)y2

top Created with Sketch.