You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 22:25:16