如何解决Sympy绘制隐函数cons12=0时线条过粗的问题
Sympy隐函数绘图效果优化方案
sympy自带的plot_implicit默认采样精度低、线宽偏大,是导致绘图效果差的核心原因,可通过以下两种方案优化:
方案1:直接调整plot_implicit内置参数
通过调高采样深度、缩小线宽即可快速改善效果,示例代码如下:
p = plot_implicit( Eq(cons12, 0), (b, 0, 4), (d, 0, 6), depth=6, # 采样深度,默认值为2,数值越高采样越密、线条越平滑,对应计算耗时更长 linewidth=0.7, # 线宽,默认值为1.5,调小即可得到更细的线条 adaptive=True # 开启自适应采样,曲线变化剧烈的区域会自动加密采样点 )
方案2:转数值函数用Matplotlib原生绘制(更推荐)
sympy的绘图功能是对Matplotlib的简化封装,可调参数少,直接将符号表达式转为数值函数后用Matplotlib的contour绘制,效果可控度更高:
from sympy import lambdify, nsimplify import numpy as np import matplotlib.pyplot as plt # 可选:先将表达式转有理式,降低数值计算误差 cons12_rational = nsimplify(cons12) # 把符号表达式转为可批量计算的数值函数 f_cons = lambdify((b, d), cons12_rational, 'numpy') # 生成坐标网格,网格点数越高线条越平滑,2000~3000点为常规精度 b_arr = np.linspace(0, 4, 2000) d_arr = np.linspace(0, 6, 2000) b_grid, d_grid = np.meshgrid(b_arr, d_arr) # 计算网格点上的函数值 z_val = f_cons(b_grid, d_grid) # 绘制0值等高线,即cons12=0的隐函数曲线 plt.figure(figsize=(7, 8)) plt.contour( b_grid, d_grid, z_val, levels=[0], # 仅绘制值为0的等高线 linewidths=0.6, # 自定义线宽 colors='darkblue' # 自定义线条颜色 ) plt.xlabel('b', fontsize=12) plt.ylabel('d', fontsize=12) plt.xlim(0, 4) plt.ylim(0, 6) plt.grid(alpha=0.2) plt.show()
如果绘制时出现线条断裂、锯齿明显的问题,可继续调高网格生成时linspace的点数,若出现数值溢出报错,可将contour的输入改为np.sign(z_val),仅保留函数值的正负信息即可识别零值位置。
内容的提问来源于stack exchange,提问作者edgardeitor
相关产品推荐
相关产品推荐

