圆锥曲线 Python 可视化 45 分钟实践指南:三个滑块做出交互演示
2026/9/20 20:51:02 网站建设 项目流程

圆锥曲线 Python 可视化 45 分钟实践指南:三个滑块做出交互演示

【免费下载链接】Book3_Elements-of-MathematicsBook_3_《数学要素》 | 鸢尾花书:从加减乘除到机器学习;上架;欢迎继续纠错,纠错多的同学还会有赠书!项目地址: https://gitcode.com/GitHub_Trending/bo/Book3_Elements-of-Mathematics

跑通开源项目《数学要素》(Book3_Elements-of-Mathematics) 后,你在浏览器里拖动滑块,椭圆会实时地倾斜、变扁、变圆。本文用该项目的第 9 章代码,带你走通圆锥曲线 Python 可视化与交互演示的完整流程:先出一张静态图,再升级成可拖动的网页。需要的数学只有一个区分椭圆、抛物线、双曲线的数字。

安装依赖命令与克隆仓库:先把环境跑起来

这一节能让你的环境不再卡在安装步骤上,后面的代码才能只在"数学"上出错。一共四个库:numpy 做数值计算,matplotlib 负责画图,streamlit 生成网页,jupyter 用来打开 Notebook。

git clone https://gitcode.com/GitHub_Trending/bo/Book3_Elements-of-Mathematics cd Book3_Elements-of-Mathematics pip install numpy matplotlib streamlit jupyter

打开文件有两种方式:终端执行jupyter notebook,然后在浏览器里选第 9 章的 Notebook 逐个运行;或者用 VS Code 直接点开 .ipynb 文件。Streamlit 应用在后面一节用一条命令启动。三条命令全部执行完毕且没有报错,就可以进入下一节。

离心率与曲线类型对照表:一把统一的尺子

这一节能给你一张读图用的表。圆锥曲线是平面切圆锥得到的曲线,主要有椭圆、抛物线、双曲线三类,圆算椭圆的特例。判断一条曲线属于哪一类,看离心率 e(Eccentricity,衡量它"偏离正圆"的程度)就够了:

e 的取值曲线类型直观形状
e = 0椭圆的特例
0 < e < 1椭圆e 越大越扁长
e = 1抛物线向一个方向"张开"
e > 1双曲线左右两支,向外张开

椭圆标准方程写作:

$$\frac{x^2}{a^2} + \frac{y^2}{b^2} = 1$$

a、b 分别是半长轴和半短轴,a 与 b 相等时变成圆,e 回到 0。记牢这张表,后面图里每一道颜色深浅不同的曲线,你都能说出它的家底。

三步运行圆锥曲线 Notebook:出第一张静态图

这一节能让你在 5 分钟内看到项目的标志性画面:31 条曲线挤在同一张图里,颜色从红到蓝渐变,形状从圆一路演化到椭圆再到双曲线。对应文件是 Book3_Ch09_Python_Codes/Bk3_Ch09_01.ipynb。

第一步,在 Jupyter 里打开它,点 "Run All"。能直接出图就跳到第三步;出不了再看第二步的核心代码。

x = np.linspace(-4, 4, num=201) y = np.linspace(-4, 4, num=201) xx, yy = np.meshgrid(x, y) # 生成 201×201 的坐标网格 e_array = np.linspace(0, 3, num=31) # 31 个 e 值,从 0 均匀排到 3 for i, e in enumerate(e_array): f = yy**2 - (e**2 - 1) * xx**2 - 2 * xx # 圆锥曲线方程 plt.contour(xx, yy, f, levels=[0]) # 描出 f 等于 0 的曲线

三个设计点值得记住。一是为什么用网格:contour 不是逐点连线,而是扫描每个网格点、挑出函数值恰好为 0 的位置,曲线就在那里,所以必须有 meshgrid。二是为什么一个式子加一个循环:项目刻意让三类曲线共用同一表达式,只改 e,于是同一张图里直接看得到从椭圆经抛物线到双曲线的连续变形,这就是"圆锥曲线"的统一性。三是 levels=[0] 的含义:零水平等高线就是满足方程的点集,也就是曲线本体。

第三步,改一个数字验证理解:把 31 改成 11 再运行,曲线变稀疏,但每条的形状没变,只是色带变粗。运行完,你应该看到窗口里出现一组由椭圆渐变到双曲线的曲线。

一键启动 Streamlit 应用:拖动滑块操控椭圆

这一节能把"看图"变成"玩图"。项目里的 Streamlit_Bk3_Ch09_03.py 会在浏览器画一个虚线矩形,和一组永远与矩形四边相切的内接椭圆。左侧三个滑块分别控制 m(矩形宽)、n(矩形高)、rho(倾斜度):rho 为 0 时椭圆正放,往两边拖,椭圆逐渐"歪"过去。

在终端执行下面这条命令,Streamlit 会自动在浏览器打开本地页面(默认 http://localhost:8501):

streamlit run Book3_Ch09_Python_Codes/Streamlit_Bk3_Ch09_03.py

核心逻辑压成这几行:

with st.sidebar: m = st.slider('m', 1.0, 2.0, value=1.5, step=0.1) n = st.slider('n', 1.0, 2.0, value=1.5, step=0.1) rho = st.slider('rho', -1.0, 1.0, value=0.0, step=0.05) ellipse = ((xx/m)**2 - 2*rho*(xx/m)*(yy/n) + (yy/n)**2) / (1 - rho**2) plt.contour(xx, yy, ellipse, levels=[1], colors=['b']) st.pyplot(fig)

交互的关键在 Streamlit 的运行机制:每拖动一次滑块,整个脚本就从头再执行一遍,用新的 m、n、rho 重算椭圆方程并重画,曲线看起来才像"实时响应"。xx、yy 网格的生成方式和 Notebook 里完全一样。启动后,你应该看到虚线矩形内嵌着一个蓝色椭圆,拖 rho 时它左右倾斜,改 m、n 时矩形比例同步变化。

常见问题 FAQ

终端提示 "Port 8501 is already in use"?上次启动的 Streamlit 进程还占着端口。到那个终端按 Ctrl+C 结束它,或换个端口启动:在命令末尾追加--server.port 8502

浏览器里图形空白,只有坐标轴?多半是曲线算出来了但落在显示范围外。检查脚本里的 set_xlim、set_ylim,先临时放宽到 -5 到 5 确认曲线存在,再收紧范围。

图中中文显示为方框?系统缺中文字体。Linux 可安装fonts-noto-cjk,或把图内标签临时换成英文。

轮廓发虚、边缘有折角?提高网格分辨率,把 num=201 改成 401,曲线立刻平滑,代价是运行时间略长。

升级库后 matplotlib 报版本错误?通常是 numpy 与 matplotlib 版本错配,执行pip install -U numpy matplotlib一起升级,再重启内核。

圆锥曲线只在课本里出现吗?不止。二维高斯分布的等高线就是椭圆,马氏距离圈出的"正常范围"也是椭圆,项目第 19 章(优化入门)还会反复用到这些形状,可以之后回来看。

资源清单与动手挑战 🖱️

项目内建议按这个顺序读:

  • 正文:Book3_Ch08_圆锥曲线__数学要素__从加减乘除到机器学习.pdf 建立几何直觉;Book3_Ch09_深入圆锥曲线__数学要素__从加减乘除到机器学习.pdf 深入参数与性质
  • Notebook:Bk3_Ch09_01.ipynb 离心率渐变、Bk3_Ch09_02.ipynb 随 rho 变形的椭圆、Bk3_Ch09_03.ipynb 内切矩形的椭圆、Bk3_Ch09_04.ipynb 超椭圆(指数越大越接近方形)、Bk3_Ch09_05.ipynb 圆锥曲线一般式
  • 交互应用:Streamlit_Bk3_Ch09_03.py、Streamlit_Bk3_Ch09_04.py
  • 项目说明:README.md

动手挑战:把 Bk3_Ch09_01.ipynb 在本地复制一份(仓库本身保持只读),将np.linspace(0, 3, num=31)改成np.linspace(0, 1.5, num=16)后运行,你会发现图里只剩椭圆、最远一条抛物线,说说原因;再把 num 改回 3,只画 3 条曲线,判断各自属于哪一类。能准确说出三条曲线对应的 e 区间,这条线就算彻底跑通了。

【免费下载链接】Book3_Elements-of-MathematicsBook_3_《数学要素》 | 鸢尾花书:从加减乘除到机器学习;上架;欢迎继续纠错,纠错多的同学还会有赠书!项目地址: https://gitcode.com/GitHub_Trending/bo/Book3_Elements-of-Mathematics

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询