Sympy绘制特定积分函数:Jupyter环境下的实现方法咨询
最优实现步骤
优先采用符号解析积分+数值化绘图的方案,比直接数值积分效率更高、结果更准确:
第一步:导入依赖库
在Jupyter单元格中运行:import sympy as sp import numpy as np import matplotlib.pyplot as plt %matplotlib inline # 让图像直接显示在Jupyter中第二步:计算积分的解析表达式
定义符号变量和被积函数,用Sympy求解解析解:t, x = sp.symbols('t x') integrand = sp.ln(1 + t**2) / (t*(1 + t**2)) # 计算定积分 F_sym = sp.integrate(integrand, (t, 0, 1/sp.cos(x)))运行后会得到解析结果:
-polylog(2, -tan(x)**2)/2 + (log(tan(x)**2 + 1)**2)/8这里用到的多对数函数
polylog,Sympy可以很好地完成其数值转换。第三步:将符号函数转为数值函数
用lambdify把Sympy表达式转换成支持Numpy数组的函数,方便批量计算:F_num = sp.lambdify(x, F_sym, 'numpy')第四步:生成数据并绘图
注意1/cos(x)的定义域:cos(x)≠0且cos(x)>0,因此x的取值范围是(-π/2, π/2),需避开奇点:# 生成x的数值点,两端留0.1余量避免接近奇点 x_vals = np.linspace(-np.pi/2 + 0.1, np.pi/2 - 0.1, 1000) y_vals = F_num(x_vals) # 绘图 plt.figure(figsize=(10, 6)) plt.plot(x_vals, y_vals, label=r'$F(x) = \int_0^{1/\cos(x)} \frac{\ln(1+t^2)}{t(1+t^2)} dt$') plt.xlabel('x') plt.ylabel('F(x)') plt.title('Plot of Integral Function F(x)') plt.grid(True, alpha=0.3) plt.legend(fontsize=12) plt.show()
备选方案:直接数值积分
如果遇到Sympy无法求出解析解的复杂积分,可使用Scipy的数值积分:
from scipy.integrate import quad def compute_F(x): # 定义数值被积函数 integrand = lambda t: np.log(1 + t**2) / (t*(1 + t**2)) # 计算定积分,忽略误差项 result, _ = quad(integrand, 0, 1/np.cos(x)) return result x_vals = np.linspace(-np.pi/2 + 0.1, np.pi/2 - 0.1, 100) y_vals = [compute_F(x) for x in x_vals] # 绘图代码与上述一致 plt.figure(figsize=(10,6)) plt.plot(x_vals, y_vals, label=r'$F(x) = \int_0^{1/\cos(x)} \frac{\ln(1+t^2)}{t(1+t^2)} dt$') plt.xlabel('x') plt.ylabel('F(x)') plt.title('Plot of Integral Function F(x)') plt.grid(True, alpha=0.3) plt.legend() plt.show()
关键注意点
- x必须避开
±π/2,否则cos(x)=0会导致积分上限无穷大(虽积分在x→±π/2时收敛,但数值计算会报错) - 解析法计算速度远快于数值积分法,优先使用
- 可通过Sympy验证极限行为,比如计算x→π/2⁻时F(x)的极限:
结果为sp.limit(F_sym, x, sp.pi/2, dir='-')π²/24,可在绘图中观察函数趋近于该值。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

