Sympy无法绘制含阶乘的浮点概率函数问题求助
问题分析与解决
你的绘图未显示曲线的核心原因是:将符号变量传入了带.evalf()的Python函数,导致SymPy无法正确对每个绘图点的数值x计算函数值。
问题细节
你定义的f(x)是Python函数,内部直接调用.evalf()。当传入符号变量x时,factorial(365 - x)是未替换数值的符号表达式,.evalf()无法针对绘图时的每个具体x值计算结果,最终导致绘图函数无法生成有效曲线数据。
修正后的代码
将函数定义为纯符号表达式,让SymPy在绘图时自动处理数值代入:
from sympy import * from sympy.plotting import plot init_printing() # 定义符号变量,指定为整数(符合生日问题的x取值逻辑) x = symbols('x', integer=True) # 定义符号形式的概率函数 f = factorial(365) / factorial(365 - x) / (365**x) # 计算x=5时的函数值 display(f.subs(x, 5).evalf()) # 绘制函数曲线 plot(f, (x, 0, 100), ylim=[0, 2])
另一种方案:用lambdify转换为数值函数(配合Matplotlib)
如果你更习惯用数值绘图,可以把符号表达式转成NumPy可计算的函数:
from sympy import * import matplotlib.pyplot as plt import numpy as np init_printing() x = symbols('x', integer=True) f = factorial(365) / factorial(365 - x) / (365**x) # 转换为数值函数 f_np = lambdify(x, f, 'numpy') x_vals = np.arange(0, 101) y_vals = f_np(x_vals) # 计算x=5的值 print(f_np(5)) # 绘图 plt.plot(x_vals, y_vals) plt.ylim(0, 2) plt.show()
内容的提问来源于stack exchange,提问作者Yiffany
相关产品推荐
相关产品推荐

