ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Python+Matplotlib可视化二重极限与累次极限:三个经典反例图解

2026/9/8 1:31:21 拓冰建站 浏览量
Python+Matplotlib可视化二重极限与累次极限:三个经典反例图解 学习多元微积分时大多数人第一次感到“定义突然变难”的地方就是二元函数的极限。一元函数只需要看左右两条路径到了二元函数话术立刻变成“沿任意路径趋近”“以任何方式接近原点”。不少同学还会把二重极限和累次极限混为一谈做题时先对 x 求极限再对 y 求极限以为这就是二重极限。本文就用 Python Matplotlib 把这两个概念真正“画”出来并结合三个经典反例从图像上理解二重极限为什么经常不存在、累次极限和二重极限为什么没有简单关系。文章包含完整可复现的可视化代码、极坐标换元分析、常见错误排查思路适合正在学习高等数学的大学生也适合需要快速回顾多元极限知识点的开发者。1. 二重极限与累次极限先分清概念1.1 从一元极限说起一元函数 ( f(x) ) 在 ( x_0 ) 处的极限直观上回答的问题是当 ( x ) 不断靠近 ( x_0 ) 时函数值是否稳定地向某个数 ( L ) 靠拢。在一维数轴上( x ) 只能从 ( x_0 ) 的左边或右边靠近所以判断标准很简单左极限和右极限都存在且相等那么一元极限存在。这个“从左和从右逼近”的思路一旦进入二元函数就会失效。原因在于平面上的动点 ( (x,y) ) 可以从正上方、正右方、任意斜向射线、抛物线甚至螺旋曲线接近 ( (x_0,y_0) )可行路径数量不是两条而是无穷多条。每条路径都可能让函数值产生完全不同的走向。所以多元极限不能再用“左、右”这种有限的路径分类必须退回到“距离”和“邻域”的语言。这也是二重极限的定义看起来比一元极限抽象很多的原因。初学者如果只记住“从各个方向趋近”却没有意识到“路径无限多”这层含义后面做题时很容易踩坑。1.2 二重极限Double Limit的定义二重极限在英文中通常写作 double limit定义如下设函数 ( f(x,y) ) 在点 ( (x_0,y_0) ) 的某个去心邻域内有定义若存在常数 ( L )对任意给定的 ( \varepsilon 0 )总存在 ( \delta 0 )使得当动点 ( (x,y) ) 满足[ 0 \sqrt{(x-x_0)^2 (y-y_0)^2} \delta ]时恒有[ |f(x,y) - L| \varepsilon ]则称 ( L ) 是 ( f ) 在 ( (x_0,y_0) ) 处的二重极限记作[ \lim_{(x,y) \to (x_0,y_0)} f(x,y) L ]这里判断距离用的是欧几里得距离 ( \sqrt{(x-x_0)^2 (y-y_0)^2} )。只要距离足够小无论动点处于哪个角度、沿什么轨迹进来函数值都要落在 ( L ) 的 ( \varepsilon ) 邻域内。换句话说二重极限关心的是“整个二维邻域内的一致性”而不是某一条或某几条路径上的表现。函数在 ( (x_0,y_0) ) 这一点上是否有定义并不重要二重极限考察的是“去心邻域”内的行为。这也是用图像理解时曲面在原点处常常会留下一个小洞的原因。1.3 累次极限Iterated Limit的定义与二重极限并列的另一个概念是累次极限英文叫 iterated limit也叫 repeated limit。它描述的是“先求一个变量的极限再求另一个变量极限”这种两步操作。例如下面两个式子[ \lim_{x \to x_0} \left[ \lim_{y \to y_0} f(x,y) \right] ][ \lim_{y \to y_0} \left[ \lim_{x \to x_0} f(x,y) \right] ]第一个的意思是先把 ( x ) 固定在 ( y \to y_0 ) 的过程中对函数取极限得到一个只关于 ( x ) 的函数然后再让 ( x \to x_0 )看这个函数是否收敛。第二个累次极限则是先对 ( x ) 取极限再对 ( y ) 取极限。从操作顺序上可以感受到累次极限每一步都是一元极限所以计算相对机械而二重极限要求整个平面上的“一致趋近”明显更苛刻。正是这种差异导致两者之间不存在简单包含关系。1.4 二者没有包含关系很多初学者会默认二重极限存在累次极限就一定存在且相等或者反过来两个累次极限都存在且相等二重极限就一定存在。这两种直觉都是错误的。严谨的说法是二重极限存在不能推出某个累次极限一定存在两个累次极限都存在且相等也不能推出二重极限存在只有额外条件成立时例如函数在 ( (x_0,y_0) ) 连续或内层极限关于外层变量一致收敛才能把二者联系起来。第 4 节会用三个经典反例分别说明这些情况。看到图像之后你对这些结论的理解会比死记硬背深刻得多。2. 可视化环境准备2.1 工具清单本文所有图都用 Python 生成核心依赖只有两个NumPy负责生成网格数据、计算函数值、处理除零和 NaN。Matplotlib负责绘制 3D 曲面、热力图、二维曲线图。Python 版本不需要很新主流的 Python 3.9 到 3.12 都可以运行。NumPy 和 Matplotlib 使用常见版本即可不需要锁定具体小版本。2.2 安装依赖如果你使用 pip可以在终端执行pip install numpy matplotlib如果使用 Anaconda 或 Miniconda可以执行conda install numpy matplotlib建议在虚拟环境中安装避免污染全局 Python 环境。安装完成后可以用下面命令验证import numpy as np import matplotlib.pyplot as plt print(np.__version__)能正常输出 NumPy 版本号说明环境可用。2.3 示例项目结构为了让代码清晰我会把函数定义放到公共模块common.py绘图脚本按反例分别存放viz_double_limit/ ├── common.py ├── counterexample1_surface.py ├── counterexample1_paths.py ├── counterexample2_heatmap.py ├── counterexample3_heatmap.py ├── counterexample3_section.py └── random_path_experiment.pycommon.py中的函数会被后面的多个脚本复用# 文件路径viz_double_limit/common.py import numpy as np def f_xy_over_squares(x, y): 反例一f(x,y) xy / (x^2 y^2) denom x**2 y**2 with np.errstate(divideignore, invalidignore): z (x * y) / denom z[denom 0] np.nan return z def f_square_diff(x, y): 反例二f(x,y) (x^2 - y^2) / (x^2 y^2) denom x**2 y**2 with np.errstate(divideignore, invalidignore): z (x**2 - y**2) / denom z[denom 0] np.nan return z def f_x_sin_1_over_y(x, y): 反例三f(x,y) x * sin(1/y)y ! 0 with np.errstate(divideignore, invalidignore): z x * np.sin(1.0 / y) z[y 0] np.nan return z这里使用np.errstate抑制除零警告并把奇点位置填成np.nan。绘图时nan会自动留出空洞比在原点上强行计算安全得多。3. 用极坐标看穿二重极限的“方向依赖”3.1 极坐标换元把二维趋近变成一维在分析 ( (x,y) \to (0,0) ) 的二重极限时极坐标是效率最高的工具之一[ x r\cos\theta,\quad y r\sin\theta,\quad r \sqrt{x^2 y^2} ]当 ( r \to 0 ) 时动点离原点越来越近( \theta ) 描述动点来自哪个方向。这样一来一个二维趋近过程被拆成“距离”和“方向”两个维度。如果换元后的表达式里只剩 ( r )说明函数值只和距离有关与方向无关如果表达式里还带着 ( \theta )说明函数值可能依赖方向这就是二重极限不存在的危险信号。3.2 关键观察如果极坐标形式含有 θ通常说明方向相关拿第一个反例来看[ f(x,y) \frac{xy}{x^2 y^2} ]代入极坐标[ f \frac{r^2\cos\theta\sin\theta}{r^2} \cos\theta\sin\theta \frac{1}{2}\sin 2\theta ]这个结果与 ( r ) 完全无关只由 ( \theta ) 决定。沿 ( \theta0 )x 轴正方向取值是 0沿 ( \theta\pi/4 )直线 ( yx )取值是 ( 1/2 )沿 ( \theta\pi/2 )y 轴正方向又回到 0。当 ( r \to 0 ) 时极限值“随风向改变”自然不存在。第二个反例也一样[ g(x,y) \frac{x^2 - y^2}{x^2 y^2} \Rightarrow \cos 2\theta ]沿 x 轴趋于原点得到 1沿 y 轴趋于原点得到 -1两条路径的极限不同二重极限不存在。图像上会看到曲面像被拧成几个颜色不同的扇区视觉冲击力很强。3.3 极坐标换元什么时候可以证明存在需要注意极坐标换元并不是万能的“判定器”。如果换元后得到[ f(r\cos\theta, r\sin\theta) r \cdot h(r,\theta) ]并且存在某个函数 ( g(r) ) 满足 ( |h(r,\theta)| \leq g(r) )且 ( g(r) \to 0 )就可以用夹逼准则证明二重极限存在。例如反例三中的 ( f(x,y)x\sin(1/y) )在 ( y0 ) 的区域里有[ |x\sin(1/y)| \leq |x| r|\cos\theta| \leq r \to 0 ]所以二重极限存在。但这里的 ( \theta ) 实际上会随 ( y ) 的变化而波动必须借助不等式而不是“把 ( \theta ) 当常数”来下结论。如果化简后得到一个和 ( \theta ) 有关的定值表达式比如 ( 0.5\sin 2\theta )可以直接判断极限不存在但如果表达式里还有含 ( r ) 的分母项情况会更复杂需要回到路径法或夹逼准则不能看一眼就写答案。4. 三个经典反例的可视化实战4.1 反例一重极限不存在但累次极限存在且相等数学推导第一个反例是[ f(x,y) \frac{xy}{x^2 y^2} ]沿直线 ( ykx ) 逼近原点时[ f(x, kx) \frac{x \cdot kx}{x^2 k^2x^2} \frac{k}{1k^2} ]这个极限值与 ( k ) 有关。当 ( k0 ) 时极限是 0当 ( k1 ) 时极限是 ( 1/2 )。两条路径给出不同极限所以二重极限不存在。但累次极限却都存在且相等。先看第一个累次极限[ \lim_{y \to 0} \frac{xy}{x^2 y^2} 0 \quad (x \neq 0) ]所以[ \lim_{x \to 0}\left[\lim_{y \to 0} \frac{xy}{x^2 y^2}\right] 0 ]同理可得另一个累次极限也是 0。这就是“累次极限存在且相等但二重极限不存在”的典型例子。3D 曲面图代码下面用 Matplotlib 绘制该函数的 3D 曲面。为了避开原点除零使用极坐标网格生成数据# 文件路径viz_double_limit/counterexample1_surface.py import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from common import f_xy_over_squares r np.linspace(1e-3, 1.0, 300) theta np.linspace(0, 2 * np.pi, 400) R, THETA np.meshgrid(r, theta) X R * np.cos(THETA) Y R * np.sin(THETA) Z f_xy_over_squares(X, Y) fig plt.figure(figsize(10, 7)) ax fig.add_subplot(111, projection3d) surf ax.plot_surface(X, Y, Z, cmapviridis, linewidth0, antialiasedTrue) ax.set_xlabel(x) ax.set_ylabel(y) ax.set_zlabel(z) ax.set_title(r$f(x,y)\dfrac{xy}{x^2y^2}$) fig.colorbar(surf, shrink0.5, aspect10) plt.savefig(counterexample1_surface.png, dpi150, bbox_inchestight) plt.show()这段代码用极坐标网格生成 ( X,Y ) 坐标在 ( r0 ) 处直接避开除零。曲面颜色表示函数值大小。运行后可以看到曲面在靠近中心区域像被切成了几块颜色不同的“扇区”相同半径、不同角度上的高度明显不同这正是方向依赖性的直观体现。路径截面图再用二维曲线展示“沿不同斜率直线逼近时极限平台不同”# 文件路径viz_double_limit/counterexample1_paths.py import numpy as np import matplotlib.pyplot as plt t np.linspace(-1.0, 1.0, 200) t t[t ! 0] # 去掉原点 ks [0, 0.5, 1, 2, 5] plt.figure(figsize(9, 6)) for k in ks: z k / (1 k * k) plt.plot(t, np.full_like(t, z), labelfk{k}) plt.xlabel(t) plt.ylabel(r$f(t, kt)$) plt.title(沿不同直线 ykx 逼近原点时的函数值) plt.legend() plt.ylim(-0.1, 0.7) plt.grid(alpha0.3) plt.savefig(counterexample1_paths.png, dpi150, bbox_inchestight) plt.show()因为 ( f(t,kt)k/(1k^2) ) 与 ( t ) 无关所以每条直线路径对应的都是一条水平线。不同 ( k ) 对应不同高度的平台说明函数值在被逼近原点之前就已经“各自为政”根本不可能收敛到同一个数。4.2 反例二两个累次极限存在但不相等数学推导第二个反例是[ g(x,y) \frac{x^2 - y^2}{x^2 y^2} ]先求一个累次极限。固定 ( x \neq 0 )[ \lim_{y \to 0} \frac{x^2 - y^2}{x^2 y^2} \frac{x^2}{x^2} 1 ]所以[ \lim_{x \to 0}\left[\lim_{y \to 0} \frac{x^2 - y^2}{x^2 y^2}\right] 1 ]同理调换顺序后[ \lim_{y \to 0}\left[\lim_{x \to 0} \frac{x^2 - y^2}{x^2 y^2}\right] -1 ]两个累次极限都存在但不相等。二重极限呢沿 x 轴逼近时函数值恒为 1沿 y 轴逼近时函数值恒为 -1所以二重极限不存在。热力图代码热力图适合展示“不同方向区域颜色不同”的特点# 文件路径viz_double_limit/counterexample2_heatmap.py import numpy as np import matplotlib.pyplot as plt from common import f_square_diff x np.linspace(-1.5, 1.5, 500) y np.linspace(-1.5, 1.5, 500) X, Y np.meshgrid(x, y) Z f_square_diff(X, Y) fig, ax plt.subplots(figsize(8, 7)) cmap plt.cm.RdBu_r.copy() cmap.set_bad(white) im ax.imshow(Z, extent[-1.5, 1.5, -1.5, 1.5], originlower, cmapcmap, vmin-1, vmax1) # 叠加两条趋势路径 ax.plot([0, 1.2], [0, 0], k--, lw1.5, label沿 x 轴 - 1) ax.plot([0, 0], [0, 1.2], k--, lw1.5, label沿 y 轴 - -1) ax.set_xlabel(x) ax.set_ylabel(y) ax.set_title(r$f(x,y)\dfrac{x^2-y^2}{x^2y^2}$ 热力图) ax.legend(loclower right) fig.colorbar(im, shrink0.8) plt.savefig(counterexample2_heatmap.png, dpi150, bbox_inchestight) plt.show()从热力图上可以清楚看到x 轴附近区域是红色系取值接近 1y 轴附近区域是蓝色系取值接近 -1。越靠近原点这两个区域的分界越明显。无论选择多小的圆形邻域里面都同时存在红色和蓝色区域所以函数值根本无法稳定到某个唯一的 ( L ) 上。4.3 反例三重极限存在但累次极限不存在数学推导第三个反例是[ h(x,y) x\sin\frac{1}{y}, \quad y \neq 0 ]先判断二重极限。因为[ \left|x\sin\frac{1}{y}\right| \leq |x| ]而 ( |x| \leq \sqrt{x^2y^2} )所以当 ( (x,y)\to(0,0) ) 时[ |h(x,y)| \leq \sqrt{x^2y^2} \to 0 ]由夹逼准则可知[ \lim_{(x,y)\to(0,0)} x\sin\frac{1}{y} 0 ]也就是说二重极限不仅存在而且就是 0。但累次极限呢固定 ( x \neq 0 )先让 ( y \to 0 )[ \lim_{y \to 0} x\sin\frac{1}{y} ]由于 ( 1/y \to \infty )正弦函数无限振荡极限不存在。因此累次极限[ \lim_{x \to 0}\left[\lim_{y \to 0} x\sin\frac{1}{y}\right] ]根本写不出来。这就是“重极限存在累次极限不存在”的典型例子。振荡热力图和截面图为了把振荡画出来先看热力图# 文件路径viz_double_limit/counterexample3_heatmap.py import numpy as np import matplotlib.pyplot as plt from common import f_x_sin_1_over_y x np.linspace(-0.1, 0.1, 400) y np.linspace(0.001, 0.02, 600) X, Y np.meshgrid(x, y) Z f_x_sin_1_over_y(X, Y) # 截断颜色范围避免个别大值影响整体观感 Z[Z 0.05] 0.05 Z[Z -0.05] -0.05 fig, ax plt.subplots(figsize(10, 6)) cmap plt.cm.RdBu_r.copy() cmap.set_bad(white) im ax.imshow(Z, extent[-0.1, 0.1, 0.001, 0.02], originlower, aspectauto, cmapcmap, vmin-0.05, vmax0.05) ax.set_xlabel(x) ax.set_ylabel(y) ax.set_title(r$h(x,y)x\sin(1/y)$ 在原点附近的振荡条纹) fig.colorbar(im, shrink0.8) plt.savefig(counterexample3_heatmap.png, dpi150, bbox_inchestight) plt.show()图像中会出现大量横向条纹而且越靠近 ( y0 ) 条纹越密。这表示在任意小的邻域内函数都在高频振荡。不过整体振幅被 ( |x| ) 限制住所以二重极限仍然为 0。再看固定 ( x0.05 ) 时的一维截面# 文件路径viz_double_limit/counterexample3_section.py import numpy as np import matplotlib.pyplot as plt x0 0.05 ys np.linspace(0.0005, 0.005, 3000) zs x0 * np.sin(1 / ys) fig, ax plt.subplots(figsize(10, 3.5)) ax.scatter(ys, zs, s0.3, csteelblue) ax.axhline(0, colorred, lw0.8) ax.set_xlabel(y) ax.set_ylabel(r$h(0.05, y)$) ax.set_title(固定 x0.05y 越接近 0 振荡越剧烈) plt.tight_layout() plt.savefig(counterexample3_section.png, dpi150, bbox_inchestight) plt.show()散点图清楚显示随着 ( y ) 不断接近 0函数值在 ( [-0.05, 0.05] ) 内来回跳动根本不会收敛到某个值。这就是内层累次极限不存在的视觉证据。4.4 三个反例对比表反例函数二重极限累次极限结论反例一( xy/(x^2y^2) )不存在存在且都等于 0累次极限存在不能推出重极限存在反例二( (x^2-y^2)/(x^2y^2) )不存在存在但不相等累次极限不相等时重极限必不存在反例三( x\sin(1/y) )存在且等于 0有一个不存在重极限存在不能推出累次极限存在这张表就是多重极限和累次极限之间“互不包含”关系的浓缩总结。5. 常见错误与排查思路5.1 沿 x 轴和 y 轴极限都相等能说明重极限存在吗不能。反例一中沿 x 轴、y 轴的极限都是 0但沿 ( yx ) 的极限是 ( 1/2 )重极限不存在。原因是坐标轴只是所有路径中的两条。平面上有无数条曲线可以把动点送到原点坐标轴路径只能证明“这两个特殊方向上没有问题”无法覆盖其他方向。只要找到两条路径的极限不一致即使它们之间的夹角再小也足以否定二重极限。5.2 为什么要避免只令 ykx有些同学习惯“令 ( ykx )”发现极限与 ( k ) 无关就认为二重极限存在。这个做法只能作为辅助试探不能作为证明方法。反例是[ f(x,y) \frac{x^2 y}{x^4 y^2} ]沿任意直线 ( ykx )[ f(x, kx) \frac{x^2 \cdot kx}{x^4 k^2 x^2} \frac{kx}{x^2 k^2} \to 0 ]对一切有限 ( k )极限都是 0。但如果沿抛物线 ( yx^2 )[ f(x, x^2) \frac{x^2 \cdot x^2}{x^4 x^4} \frac{1}{2} ]极限直接变成 ( 1/2 )。所以即使所有直线路径都给出相同极限重极限依然可以不存在。问题的根源在于直线路径只覆盖了“角度固定”的趋近方式没有覆盖“角度随半径变化”的路径例如抛物线、螺旋线等。5.3 极坐标下 r→0 后还有 θ说明什么如果极坐标换元后得到的是一个纯粹的 ( \theta ) 函数比如 ( \cos 2\theta )、( 0.5\sin2\theta )那可以直接说明重极限不存在因为取不同 ( \theta ) 会得到不同极限值。但如果表达式里同时含 ( r ) 和 ( \theta )且 ( \theta ) 本身随 ( r ) 变化就要回到原始路径判断。前面 5.2 中的函数在极坐标下是[ f \frac{r\cos^2\theta\sin\theta}{r^2\cos^4\theta \sin^2\theta} ]对任意固定 ( \theta )当 ( r \to 0 ) 时极限都是 0但如果让 ( \theta ) 随 ( r ) 一起趋于 0沿 ( yx^2 ) 就能得到 ( 1/2 )。这说明“固定 ( \theta ) 后取极限”和“动点实际路径中 ( \theta ) 变化”是两回事。极坐标换元可以帮助建立直觉但不能机械地用它下结论。5.4 排查清单遇到二重极限题目时可以按下面的顺序排查先尝试直接代入如果得到具体数值说明函数在该点连续极限就是该值。观察是否有因式分解或放缩条件例如 ( x^2y^2 )、( |x| ) 这样的因子考虑夹逼准则。尝试常见反例路径( ykx )、( yx^2 )、( xy^2 )、极坐标沿固定角度。如果极坐标换元后结果只含 ( \theta )基本可以判定重极限不存在。用到第 6 节的数值实验辅助判断方向但最终必须用 ( \varepsilon-\delta ) 或夹逼准则写出严格证明。6. 学习与工程建议6.1 证明顺序的建议处理二重极限时我建议先“证否”、后“证真”。因为找一个反例路径通常比严格证明存在更容易。先花少量时间尝试 ( ykx )、( yx^2 ) 等常规路径如果发现不同路径极限不一致题目直接解决如果所有尝试都指向同一个极限再开始考虑用夹逼准则或定义证明。不要一上来就写 ( \varepsilon-\delta )那样效率很低。合理利用路径法试探方向再用严格方法收尾是很多数学分析学习者的通用做法。6.2 利用数值实验辅助判断在写严格证明之前可以用随机路径数值实验获得直觉。下面脚本在半径为 ( 10^{-4} ) 的圆弧上随机取点观察函数值分布# 文件路径viz_double_limit/random_path_experiment.py import numpy as np import matplotlib.pyplot as plt from common import f_xy_over_squares, f_square_diff, f_x_sin_1_over_y def end_values(func, n300, r_val1e-4): angles [] vals [] for _ in range(n): theta np.random.uniform(0, 2 * np.pi) x r_val * np.cos(theta) y r_val * np.sin(theta) v func(x, y) if np.isfinite(v): angles.append(theta) vals.append(v) return np.array(angles), np.array(vals) fig, axes plt.subplots(1, 3, figsize(15, 4), shareyTrue) for ax, func, name in [ (axes[0], f_xy_over_squares, r$xy/(x^2y^2)$), (axes[1], f_square_diff, r$(x^2-y^2)/(x^2y^2)$), (axes[2], f_x_sin_1_over_y, r$x\sin(1/y)$), ]: angles, vals end_values(func) ax.scatter(angles, vals, s4, alpha0.6) ax.set_title(name) ax.set_xlabel(随机方向角) ax.grid(alpha0.3) axes[0].set_ylabel(距离原点极小处的函数值) plt.tight_layout() plt.savefig(random_path_experiment.png, dpi150, bbox_inchestight) plt.show()前两张图会明显显示出函数值随方向角分布在不同高度说明重极限不稳定第三张图由于振幅受 ( |x| ) 压制数值会非常接近 0这和数学结论一致。数值实验只能提供直觉不能代替证明。但它能帮你快速确认“这里是不是有大坑”。6.3 与后续课程内容的衔接二重极限与累次极限的关系在后续学习中会反复出现。例如讨论二元函数可微性时需要判断偏导数是否连续讨论累次积分换序时会遇到积分次序是否可以交换的问题讨论含参变量积分时极限与积分、极限与求导的交换都依赖于一致收敛条件。这些本质上都是在处理“整体一致趋近”和“逐次趋近”之间的差异。因此把多重极限彻底理解清楚收益不止于应付这一章作业而是为后面全微分、方向导数、曲面积分、含参积分等内容打基础。7. 总结与下一步学习路线本文围绕二重极限与累次极限的区别展开核心结论有三个二重极限要求动点以任意方式、任意路径趋近时函数值都趋于同一个数累次极限只是“先对 x、后对 y”的两步一元极限与二重极限没有必然包含关系判断极限不存在时路径法和极坐标换元非常高效判断极限存在时夹逼准则和 ( \varepsilon-\delta ) 定义才是可靠工具。同时三个经典反例非常值得反复琢磨[ \frac{xy}{x^2y^2},\quad \frac{x^2-y^2}{x^2y^2},\quad x\sin\frac{1}{y} ]如果你能把它们对应的图像、极限结论和为什么都讲清楚说明你已经真正理解了这个知识点而不只是记住了答案。下一步建议学习偏导数与全微分之间的关系重点搞清楚“偏导数存在”并不等于“可微”这件事。你会发现它背后的直觉和二重极限有很强的相似性偏导数只关心坐标轴方向的斜率可微性要求整个邻域内的一致逼近。最后给你一个动手建议把本文三个函数换成其他极限函数例如 ( \frac{x^2y}{x^4y^2} )用同样的 Matplotlib 代码画一画再分析它的路径极限。画图的过程可能会让你发现很多数学分析教材里不会明说的直观规律。