2.4 微积分 题目
- 绘制函数y=f(x)=x3−1xy = f(x) = x^3 - \frac{1}{x}y=f(x)=x3−x1和其在x=1x = 1x=1处切线的图像。
- 求函数f(x)=3x12+5ex2f(\mathbf{x}) = 3x_1^2 + 5e^{x_2}f(x)=3x12+5ex2的梯度。
- 函数f(x)=∥x∥2f(\mathbf{x}) = \|\mathbf{x}\|_2f(x)=∥x∥2的梯度是什么?
- 尝试写出函数u=f(x,y,z)u = f(x, y, z)u=f(x,y,z),其中x=x(a,b)x = x(a, b)x=x(a,b),y=y(a,b)y = y(a, b)y=y(a,b),z=z(a,b)z = z(a, b)z=z(a,b)的链式法则。
解答
{"value":"","field":"reasoning_content"}
以下是四个问题的解答:
- 绘制函数y = x\^3 - \\frac{1}{x}及其在x=1处的切线
步骤:
计算导数:f'(x) = 3x\^2 + \\frac{1}{x\^2}
求x=1处的导数值:f'(1) = 3(1)\^2 + \\frac{1}{1\^2} = 4
求x=1处的函数值:f(1) = 1\^3 - \\frac{1}{1} = 0
切线方程:y = 4(x-1) + 0 \\Rightarrow y = 4x - 4
图像特征:
原函数在x\>0时,随x增大快速上升;在x\<0时,因-1/x项主导,左侧有垂直渐近线。
切线在x=1处与函数相切,斜率为4。
-
求函数f(\\mathbf{x}) = 3x_1\^2 + 5e\^{x_2}的梯度
梯度计算:
\\nabla f = \\begin{bmatrix} \\frac{\\partial f}{\\partial x_1} \\frac{\\partial f}{\\partial x_2} \\end{bmatrix} = \\begin{bmatrix} 6x_1 5e\^{x_2} \\end{bmatrix}
-
函数f(\\mathbf{x}) = \|\\mathbf{x}\|_2的梯度
定义:f(\\mathbf{x}) = \\sqrt{x_1\^2 + x_2\^2 + \\dots + x_n\^2}
梯度公式(当\\mathbf{x} \\neq \\mathbf{0}时):
\\nabla f = \\frac{\\mathbf{x}}{\|\\mathbf{x}\|_2}
特例:若\\mathbf{x} = \\mathbf{0},梯度不存在(原点处不可导)。
- 链式法则应用:u = f(x,y,z),其中x = x(a,b), y = y(a,b), z = z(a,b)
链式法则表达式:\\frac{\\partial u}{\\partial a} = \\frac{\\partial f}{\\partial x} \\cdot \\frac{\\partial x}{\\partial a} + \\frac{\\partial f}{\\partial y} \\cdot \\frac{\\partial y}{\\partial a} + \\frac{\\partial f}{\\partial z} \\cdot \\frac{\\partial z}{\\partial a}
\\frac{\\partial u}{\\partial b} = \\frac{\\partial f}{\\partial x} \\cdot \\frac{\\partial x}{\\partial b} + \\frac{\\partial f}{\\partial y} \\cdot \\frac{\\partial y}{\\partial b} + \\frac{\\partial f}{\\partial z} \\cdot \\frac{\\partial z}{\\partial b}
公式总结
| 问题 | 关键公式 |
|---|---|
| 1 | f'(x) = 3x\^2 + \\frac{1}{x\^2},切线y = 4x - 4 |
| 2 | \\nabla f = \[6x_1, 5e^{x_2}^T] |
| 3 | [\nabla f = \frac{\mathbf{x}}{ |
| 4 | 链式法则如上述分步公式 |
| 如需进一步代码实现(如绘制图像),可提供具体编程语言要求。 |
以下是针对代码的逐层解析,主要围绕plot()和set_axes()两个绘图函数的功能实现:
一、函数功能概览
这两个函数是深度学习教材《动手学深度学习》(D2L) 中封装的标准化绘图工具,主要作用是通过简化matplotlib的API调用流程,实现快速创建规范化的科研图表。
二、set_axes()函数解析
python
#@save
def set_axes(axes, xlabel, ylabel, xlim, ylim, xscale, yscale, legend):
"""设置matplotlib的轴"""
axes.set_xlabel(xlabel) # 设置X轴标签
axes.set_ylabel(ylabel) # 设置Y轴标签
axes.set_xscale(xscale) # 设置X轴刻度类型(linear/log)
axes.set_yscale(yscale) # 设置Y轴刻度类型
axes.set_xlim(xlim) # 设置X轴范围
axes.set_ylim(ylim) # 设置Y轴范围
if legend:
axes.legend(legend) # 添加图例
axes.grid() # 显示网格
核心作用:集中配置坐标轴属性,通过参数化实现以下功能:
- 坐标标签设置(
xlabel/ylabel) - 坐标范围控制(
xlim/ylim) - 刻度类型转换(
xscale/yscale支持线性/对数坐标) - 图例与网格的显示控制
三、plot()函数解析
python
#@save
def plot(X, Y=None, xlabel=None, ylabel=None, legend=None, xlim=None,
ylim=None, xscale='linear', yscale='linear',
fmts=('-', 'm--', 'g-.', 'r:'), figsize=(3.5, 2.5), axes=None):
# 参数预处理
if legend is None: legend = []
set_figsize(figsize) # 设置画布尺寸
axes = axes if axes else d2l.plt.gca() # 获取当前axes或新建
# 数据维度检测函数
def has_one_axis(X):
return (hasattr(X, "ndim") and X.ndim == 1 or
isinstance(X, list) and not hasattr(X[0], "__len__"))
# 数据格式标准化
if has_one_axis(X): X = [X]
if Y is None: X, Y = [[]]*len(X), X
elif has_one_axis(Y): Y = [Y]
if len(X) != len(Y): X = X * len(Y)
# 清空画布并绘制曲线
axes.cla()
for x, y, fmt in zip(X, Y, fmts):
axes.plot(x, y, fmt) if len(x) else axes.plot(y, fmt)
# 调用set_axes配置坐标轴
set_axes(axes, xlabel, ylabel, xlim, ylim, xscale, yscale, legend)
关键设计亮点
-
智能数据适配
- 通过
has_one_axis()自动检测一维数据,将其包装为二维列表 - 支持
Y=None时自动用X作为Y值(此时X索引作为X轴)
- 通过
-
多曲线绘制
fmts参数预设4种线条样式(实线、品红虚线、绿点划线、红点线)- 通过
zip(X,Y,fmts)实现多组数据对应不同样式的自动匹配
-
灵活的画布控制
figsize=(3.5,2.5)默认采用论文常用的小尺寸图表- 支持传入外部
axes对象实现多子图绘制
四、典型使用示例
python
import numpy as np
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
# 绘制双曲线
plot([x, x], [y1, y2],
xlabel='x', ylabel='y',
legend=['sin(x)', 'cos(x)'],
xlim=(0, 10), ylim=(-1.5, 1.5))
输出效果:
- 生成尺寸为3.5x2.5英寸的图表
- X轴标签为"x",范围0-10;Y轴标签为"y",范围-1.5~1.5
- 两条曲线分别以实线(
'-')和品红虚线('m--')呈现 - 右下角显示图例说明
五、与原生matplotlib的对比
| 功能 | 原生matplotlib实现 | D2L plot()函数优势 |
|---|---|---|
| 多曲线绘制 | 需手动循环调用plt.plot(),样式需逐个设置 |
自动匹配数据与样式,支持批量绘制 |
| 坐标轴配置 | 需分别调用xlabel()、xlim()等多个函数 |
通过set_axes()集中配置,参数化更简洁 |
| 画布尺寸 | 需记忆plt.figure(figsize=(w,h)) |
预设科研常用尺寸,通过set_figsize()快捷调整 |
| 数据维度处理 | 需手动处理一维/二维数据转换 | 自动检测数据维度并进行标准化包装 |
该工具函数的设计充分体现了封装常用模式 和降低使用门槛的理念,特别适合深度学习实验中快速可视化训练曲线、数据分布等场景。