如何使用Python的NumPy与Matplotlib绘制曲线内侧切圆?
实现曲线内侧相切圆的Python方法
核心原理
要精准绘制与曲线内侧相切的圆,关键是计算曲线在切点处的法线方向,并确定指向内侧的方向,再沿该方向移动固定半径得到圆心坐标:
- 对曲线函数求导,得到切线斜率,进而推导法线斜率;
- 确定法线指向曲线内侧的方向向量并单位化;
- 沿单位法线向量移动半径长度,得到圆心坐标;
- 批量绘制曲线与所有相切圆。
针对反向指数曲线 ( y = e^{-x} ):
- 一阶导数(切线斜率):( y' = -e^{-x} )
- 法线斜率:( m_n = -\frac{1}{y'} = e^x )
- 指向内侧(曲线与x/y轴围成区域)的单位法线向量:( \left( -\frac{1}{\sqrt{1+e{2x}}}, -\frac{ex}{\sqrt{1+e^{2x}}} \right) )
完整代码实现
import numpy as np import matplotlib.pyplot as plt # 1. 生成曲线数据 x = np.arange(0, 2, 0.1) y = np.exp(-x) # 用numpy向量运算替代列表推导,效率更高 # 2. 设置相切圆的固定半径 r = 0.1 # 3. 批量计算所有切点对应的圆心坐标 # 计算法线斜率 mn = np.exp(x) # 计算法线方向向量的模长 norm_len = np.sqrt(1 + mn**2) # 计算指向内侧的偏移量 dx = -r / norm_len dy = -r * mn / norm_len # 最终圆心坐标 xc = x + dx yc = y + dy # 4. 绘制曲线与相切圆 fig, ax = plt.subplots(figsize=(8, 6)) # 绘制反向指数曲线 ax.plot(x, y, label='反向指数曲线 $y=e^{-x}$', color='blue') # 逐个添加相切圆 for cx, cy in zip(xc, yc): circle = plt.Circle((cx, cy), radius=r, facecolor='black', edgecolor='white') ax.add_patch(circle) # 设置坐标轴等比例,避免圆变形 ax.set_aspect('equal') # 坐标轴标签 ax.set_xlabel('x') ax.set_ylabel('y') # 添加图例 ax.legend() plt.show()
关键细节说明
- 用numpy向量运算批量处理所有切点,避免循环冗余;
- 单位法线向量的推导确保圆心始终落在曲线内侧区域;
ax.set_aspect('equal')保证圆的形状不会因坐标轴比例失衡而变形。
内容的提问来源于stack exchange,提问作者hbstha123
相关产品推荐
相关产品推荐

