使用SymPy求解函数最大值点未得预期结果,求问题排查
解决SymPy计算函数最大值点的问题
你尝试用SymPy计算函数 ( S(t) = 10e^{t/12} \left(\sin\left(\frac{\pi t}{24}\right)\right)^2 ) 的最大值点,但代码未能得到预期的t≈14的结果,问题出在以下几个地方:
代码中的错误点
- 自变量混淆:在
deriv1 = sympy.Eq(sympy.diff(S(t), x), 0, sympy.Interval(10,20))里,你错误地对x求导(函数自变量是t),导致求导结果无效;同时sympy.Eq不支持第三个参数作为区间,区间筛选应该传给solveset。 - 超越方程解的处理:该函数的导数方程是超越方程,
solveset返回的符号解包含所有定义域内的解,你需要手动筛选出(10,20)区间内的解,否则无法直接看到目标值。
修正后的代码示例
import sympy as sp # 定义函数与自变量 t = sp.symbols('t') def S(t): return 10*sp.E**(t/12)*(sp.sin((sp.pi*t)/24))**2 # 绘图确认趋势 sp.plotting.plot(S(t), (t, 0, 24)) # 计算一阶导数并构造方程 deriv = sp.diff(S(t), t) eq = sp.Eq(deriv, 0) # 方法1:求解并筛选区间(10,20)内的解 solutions = sp.solveset(eq, t, domain=sp.Interval(10, 20)) numeric_sols = [sol.evalf() for sol in solutions] print("区间内的临界点:", numeric_sols) # 方法2:直接用数值求解(指定初始值14) max_point = sp.nsolve(eq, t, 14) print("最大值点近似值:", max_point.evalf()) # 验证是否为极大值点(二阶导数判断) second_deriv = sp.diff(deriv, t) if second_deriv.subs(t, max_point).evalf() < 0: print(f"t={max_point.evalf()}是函数的极大值点")
结果说明
运行上述代码后,会得到t≈14的解,与你绘图观察的结果一致。这是因为导数方程在(10,20)区间内的解析解数值上接近14,通过数值求解或符号解求值后可以得到该点。
内容的提问来源于stack exchange,提问作者Annemarie
相关产品推荐
相关产品推荐

