
用 Python 一个参数画出完整的圆锥曲线可视化【免费下载链接】Book3_Elements-of-MathematicsBook_3_《数学要素》 | 鸢尾花书从加减乘除到机器学习上架欢迎继续纠错纠错多的同学还会有赠书项目地址: https://gitcode.com/GitHub_Trending/bo/Book3_Elements-of-Mathematics改一个数字屏幕上的椭圆瞬间变扁、开口、裂成双曲线——这是开源项目 Book3_Elements-of-Mathematics《数学要素》第 3 册鸢尾花书里你能直接体验到的圆锥曲线可视化。哪怕你从没用 Python 画过图、没碰过 Streamlit半小时也能亲手画出并操控椭圆、抛物线、双曲线前提是你会跑pip install。一个参数定三种曲线这一节解决记不住三种曲线公式的问题只需盯住一个数就能说出曲线长什么样。这个数叫离心率 eEccentricity。大白话讲它是曲线的变形仪表盘0 是最圆的状态越接近 1 越扁跨过 1 之后闭合的曲线直接炸开成两条腿张开的形状。e 0圆椭圆最圆的特例0 e 1椭圆e 1抛物线e 1双曲线课本里通常先讲平面斜着切圆锥的几何定义一句话带过即可真正干活的是代数式。椭圆有一个标准方程长这样$$x^2/a^2 y^2/b^2 1$$其中 a 是横向半径b 是纵向半径b 相对 a 缩得越狠椭圆越扁对应的离心率 $e \sqrt{1 - b^2/a^2}$ 就越接近 1。项目的 《圆锥曲线》章节Ch08 讲透了每种曲线的几何性质想深入推导的话《深入圆锥曲线》章节Ch09 有完整的推导过程。三行核心代码画出圆锥曲线族这一节解决从哪敲起的问题一段最小可运行代码跑完屏幕上就铺满 31 条曲线从圆到双曲线排成一队。第一次运行前装好两个库pip install numpy matplotlib。完整代码在仓库的Book3_Ch09_Python_Codes/目录可直接打开 Bk3_Ch09_01.ipynb 对照。下面这段是它的精简版逻辑完全一致先搭好网格、列好离心率清单再循环画线一共就三步import numpy as np import matplotlib.pyplot as plt # 网格x、y 各取 201 个点覆盖 -4 到 4 x np.linspace(-4, 4, num201) y np.linspace(-4, 4, num201) xx, yy np.meshgrid(x, y) # 31 个离心率从 0 到 3正好覆盖圆、椭圆、抛物线、双曲线 e_array np.linspace(0, 3, num31) 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): # 同一个隐函数只改 e曲线就变了 f yy**2 - (e**2 - 1) * xx**2 - 2 * xx # f 0 的点集就是曲线让 contour 把零点连成线 ax.contour(xx, yy, f, levels[0], colors[colors[i]]) ax.axhline(0, colork, linewidth0.5) # 两条坐标轴 ax.axvline(0, colork, linewidth0.5) ax.set_aspect(equal) # 横纵同比例椭圆不会被压扁 plt.show()跑完你会看到左半屏挤着一族套娃般的椭圆e1 附近出现一条向右开口的抛物线e 继续变大曲线分叉成对称的双曲线颜色由红渐蓝标记 e 的走向。注意方程里没有任何 if 分支——三种曲线共用同一个式子区别只在 e。滑块实时控制曲线形变这一节解决图是死的没法把玩的问题给页面加一个滑块鼠标一拖曲线跟着变。一个最小的 Streamlit 应用骨架就四步用st.set_page_config设置页面标题放一个控制离心率 e 的滑块按当前滑块值算出网格上的隐函数画等高线并用st.pyplot显示页面自动重跑刷新import streamlit as st import numpy as np import matplotlib.pyplot as plt st.set_page_config(page_title圆锥曲线交互可视化, layoutwide) # 核心只有一个滑块控制离心率 e st.slider(离心率 e, min_value0.0, max_value3.0, value0.5, step0.1) x np.linspace(-4, 4, num201) y np.linspace(-4, 4, num201) xx, yy np.meshgrid(x, y) f yy**2 - (e**2 - 1) * xx**2 - 2 * xx fig, ax plt.subplots(figsize(8, 8)) ax.contour(xx, yy, f, levels[0], colors[b]) ax.set_aspect(equal) ax.axhline(0, colork, linewidth0.5) ax.axvline(0, colork, linewidth0.5) st.pyplot(fig) # 滑块一动整页重跑图形立刻刷新 if e 1: st.write(f当前 e {e:.2f}这是一条椭圆) elif e 1: st.write(当前 e 1正好是抛物线) else: st.write(f当前 e {e:.2f}这是一条双曲线)用streamlit run 上面这个文件.py启动后体感是e 从 0 往上拖椭圆一圈比一圈扁拖到 1 时曲线噗地开口变成抛物线再往下拖就劈成两条分支下方的文字判断和数值同步刷新。想参考更完整的成品项目里的 Streamlit_Bk3_Ch09_03.py 用了 m、n、rho 三个滑块能同时画出椭圆、它的外接矩形和四个顶点。为什么能这样画不做推导三段话看懂原理。第一段等高线为什么就是曲线。我们不把方程解成 y f(x)而是写成一个隐函数 f(x, y)曲线就是让 f 恰好等于 0的所有点。电脑在网格上每个点都算一遍 fcontour的工作只是把 f0 的点连成线——就像地形图把海拔相同的点连成等高线这里连的是函数值恰好为零的点。第二段还有一派画法叫参数方程描点。椭圆可以写成 x a·cos t、y b·sin t让角度 t 从 0 转到 2π吐出一串 (x, y) 坐标按顺序连线即可类似儿童画本里的连点成画。第三段为什么交互起来这么容易。曲线完全由少数几个参数决定滑块改的只是 e 这一个数参数变了 → 隐函数重算 → 等高线重画。三步全是几行代码的事所以拖动即变形的体验不需要任何黑科技。圆锥曲线出现在哪里画会了顺便看看它在工作里露面的地方 SVM 决策边界核函数把数据映射到高维后分界平面投影回原空间形状常常是圆锥曲线马氏距离异常检测马氏距离一种考虑了数据拉伸方向的距离的等值线天然是椭圆画几圈同心椭圆就是正常区域的围栏二维高斯分布概率密度等高线是一族同心椭圆鸢尾花书里的热力图里随处可见收获与下一步最后清点一下这半小时你带走了什么三种圆锥曲线不用分三门记离心率 e 一个数小于 1、等于 1、大于 1 分别对应椭圆、抛物线、双曲线隐函数 ax.contour这套等高线画曲线的套路可以原样搬到其他曲线族上Streamlit 滑块让任何静态图变成演示工具核心代码不超过五行仓库Book3_Ch09_Python_Codes/目录里有更多示例README.md 能帮你定位整本书的脉络想继续动手的话两个现成的方向 把圆锥曲线换成极坐标方程再画一遍对比两种坐标系下同一个形状的差别在图上标出焦点、画一条准线验证到焦点的距离 e × 到准线的距离这个定义在屏幕上是怎么成立的【免费下载链接】Book3_Elements-of-MathematicsBook_3_《数学要素》 | 鸢尾花书从加减乘除到机器学习上架欢迎继续纠错纠错多的同学还会有赠书项目地址: https://gitcode.com/GitHub_Trending/bo/Book3_Elements-of-Mathematics创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考