圆锥曲线 31 条等高线画法:e 从 0 到 3 步进 0.1,30 分钟看懂椭圆如何过渡到双曲线
【免费下载链接】Book3_Elements-of-MathematicsBook_3_《数学要素》 | 鸢尾花书:从加减乘除到机器学习;上架;欢迎继续纠错,纠错多的同学还会有赠书!项目地址: https://gitcode.com/GitHub_Trending/bo/Book3_Elements-of-Mathematics
在 Book3_Ch09_Python_Codes/Bk3_Ch09_01.ipynb 里运行一次绘图代码,画布上会出现 31 条从红到蓝渐变的曲线:靠中心的是圆,往外一圈圈变扁的椭圆,再往外弯成抛物线状,最外层劈出两条向外张开的直线。这就是圆锥曲线等高线图——同一张图里装下了全部三类圆锥曲线。读完本文,你能独立画出这条参数曲线族,并解释每个 $e$ 值对应哪种曲线。
先看图:31 条等高线里藏着三个家族
运行 notebook 第三段代码后,画面是这么分布的:
- 网格:$x$、$y$ 都在 $[-4, 4]$ 上各取 201 个点,共 $201 \times 201$ 个采样位;
- 参数:$e$ 从 0 到 3 取 31 个值,步长恰好 0.1,所以 $e=1.0$ 这一档一定被命中;
- 配色:
RdYlBu色表把 31 条线染成红→黄→蓝的渐变,方便按颜色追踪某一条曲线随 $e$ 长大后的样子。
为什么是 31 条?$e$ 的步长 0.1 正好让 0.0、1.0、2.0 这些整数档位落在采样点上——圆、抛物线、双曲线各占一格,观察时不用估算。
拆开方程:一个参数 e 凭什么切换三种曲线
全部 31 条曲线来自同一个方程:
$$y^2 - (e^2 - 1)x^2 - 2x = 0$$
左边 $y^2$ 项和 $-2x$ 项永远不动,$e$ 只藏在 $x^2$ 的系数 $-(e^2 - 1)$ 里。曲线种类就由这个系数的符号决定:
| $e$ 的取值 | $x^2$ 系数 | 得到的曲线 |
|---|---|---|
| $e=0$ | $+1$ | 圆 $x^2+y^2=2x$,即 $(x-1)^2+y^2=1$,圆心 $(1,0)$、半径 1 |
| $0<e<1$ | $+c$,$0<c<1$ | 椭圆,$e$ 越接近 1 越扁 |
| $e=1$ | $0$(项消失) | 抛物线 $y^2=2x$,顶点在原点 |
| $e>1$ | $-c<0$ | 双曲线,渐近线斜率 $\pm\sqrt{e^2-1}$ |
代入验证三行就够:$e=0$ 得圆,$e=1$ 时 $x^2$ 项消失得 $y^2=2x$,$e=2$ 得 $y^2-3x^2-2x=0$。顺带一个容易漏掉的事实:所有曲线都过原点 $(0,0)$ 和 $(2,0)$——代回去两个点恒成立,这是整族曲线共用的几何锚点。
复现那幅渐变图:20 行 numpy 加 matplotlib
下面这段代码取自 Bk3_Ch09_01.ipynb 的核心,在验证的正是:把 $e$ 扫过 0 到 3,用 $z=0$ 的等高线把每个 $e$ 对应的曲线一次画全。运行后应看到上文描述的红蓝渐变曲线族,最内圈为正圆,两条坐标轴过原点与 $(2,0)$。
import matplotlib.pyplot as plt import numpy as np x = np.linspace(-4, 4, num=201) y = np.linspace(-4, 4, num=201) xx, yy = np.meshgrid(x, y) # 201 x 201 网格 e_array = np.linspace(0, 3, num=31) # e: 0.0, 0.1, ..., 3.0 fig, ax = plt.subplots(figsize=(8, 8)) colors = plt.cm.RdYlBu(np.linspace(0, 1, len(e_array))) for i, e in enumerate(e_array): zz = yy**2 - (e**2 - 1) * xx**2 - 2 * xx # 隐函数 z(x, y) plt.contour(xx, yy, zz, levels=[0], colors=[colors[i]]) ax.axhline(0, color='k'); ax.axvline(0, color='k') ax.set_xlim(-4, 4); ax.set_ylim(-4, 4) plt.show()这里用的是等高线法而不是参数化法:曲线写成隐函数 $z(x,y)$,让contour在 201×201 的网格上找 $z=0$ 的位置,比逐点算 $y(x)$ 省事,遇到垂直切线也不会断。
环境方面,pip install numpy matplotlib jupyter之后,克隆仓库:
git clone https://gitcode.com/GitHub_Trending/bo/Book3_Elements-of-Mathematics再用jupyter notebook打开 Book3_Ch09_Python_Codes 下的Bk3_Ch09_01.ipynb逐格运行。图形异常时先怀疑网格太稀:把两行linspace的num提到 401,线条会明显变光滑。
越过 e=1:抛物线是椭圆和双曲线之间的那一格
e 跨过 1 时,$x^2$ 系数从正翻成负,曲线身份随之切换。31 条采样里第 10 条是 $e=0.9$ 的扁椭圆,第 11 条 $e=1.0$ 是抛物线,第 12 条 $e=1.1$ 已是双曲线——切换就发生在相邻两格之间,肉眼可辨。两个边界现象值得记下:
- 只画出半支:双曲线有左右两支,但 $y^2=(e^2-1)x^2+2x$ 右边必须非负,在 $[-4,4]$ 窗口内通常只有靠近 $(2,0)$ 的那一支可见,另一支被窗口裁掉。这是视野限制,不是算法 bug。
- e 恰好为 1 时的退化:$x^2$ 项消失,方程从二次退化为 $y^2=2x$,顶点正好在原点——这也解释了为什么所有曲线都贴着原点穿过:抛物线的顶点就是那个公共点 $(0,0)$ 之一。
把 $e$ 的取值密度再加密试试:np.linspace(0.9, 1.1, num=21),你会看到抛物线被一圈圈几乎重合的椭圆和双曲线夹在中间,过渡其实相当平滑。
打开滑块:两个 Streamlit 演示里参数在动什么
想亲手拧参数,仓库里备了两个现成的交互演示。启动方式相同:
streamlit run Book3_Ch09_Python_Codes/Streamlit_Bk3_Ch09_03.py第一个应用 Streamlit_Bk3_Ch09_03.py 的侧边栏有三个滑块:$m$、$n$ 控制矩形框的宽和长(默认 1.5,范围 1.0 到 2.0),$\rho$ 控制椭圆整体的倾斜方向(默认 0,范围 -1 到 1)。拖动时,蓝色椭圆始终内接虚线矩形,四个红色叉标在椭圆顶点上,$\rho$ 从 0 拖到 ±1 的过程就是椭圆"躺倒"到矩形对角线的过程。
第二个应用 Streamlit_Bk3_Ch09_04.py 走的是另一条路:四个滑块 $a$、$b$(各 1.0 到 3.0)和 $p$、$q$(各 0.2 到 3.0)控制这个封闭曲线
$$\left|\frac{x_1}{a}\right|^{p} + \left|\frac{x_2}{b}\right|^{q} = 1$$
$p=q=2$ 是标准椭圆;$p=q=1$ 得到菱形;$p$ 或 $q$ 拖到 1 以下,边会向坐标轴方向凹陷。它和第一个应用共用同一套"隐函数+等高线"画法,差别只是参数从滑块读取。同目录的另外几个 notebook 还覆盖了第 9 章的其余小节,路径都在 Book3_Ch09_Python_Codes 下,按文件名顺序跑即可。
圆锥曲线在这本书里的位置偏前半段,椭圆随后会在概率与统计章节以"二维高斯分布的等高线"和"马氏距离圈出的正常范围"两种身份回头出现,理论部分可对照 Book3_Ch09_深入圆锥曲线__数学要素__从加减乘除到机器学习.pdf。下一步动手任务:把第一段代码里的 $-2x$ 换成 $-2dx$($d$ 从 0.5 到 3 取值 13 个),画出第二个参数扫过的曲线族,看看圆心和公共交点如何跟着移动。
【免费下载链接】Book3_Elements-of-MathematicsBook_3_《数学要素》 | 鸢尾花书:从加减乘除到机器学习;上架;欢迎继续纠错,纠错多的同学还会有赠书!项目地址: https://gitcode.com/GitHub_Trending/bo/Book3_Elements-of-Mathematics
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考