使用SymPy绘制函数导数遇报错:无法对负值自变量求导
问题分析与解决
问题原因
核心问题是你直接对整个微分方程解对象(u_sol,属于Equation类型)求导,而非对解的具体表达式(即方程右式u_sol.rhs)求导。SymPy处理方程对象求导时易出现变量识别混乱,即便设置了xlim,内部仍会尝试对默认范围(-10到10)的数值求导,最终触发报错。
解决方案
修改导数计算逻辑,先提取解的右侧表达式,再对t求导,最后代入常数:
# 替换原assumed_func2的定义 assumed_func2 = sp.diff(u_sol.rhs, t).subs({C1: 1, C2: 1}) plot(assumed_func2, xlim=(0, 10), ylim=(-5, 5), title="u'(t)")
完整修正代码示例
import sympy as sp from sympy.plotting import plot # 补全变量与函数的定义(根据你的场景调整参数) m, k, c = sp.symbols('m k c') t = sp.symbols('t') u = sp.Function('u')(t) sol1 = [(None, 1, 0.5)] # 模拟示例参数:k=1, c=0.5 # 求解微分方程 eq = m*sp.diff(u, t, 2) + c*sp.diff(u, t) + k*u u_sol = sp.dsolve(eq, u).subs({k: sol1[0][1], c: sol1[0][2]}) # 绘制原函数u(t) assumed_func1 = u_sol.rhs.subs({sp.symbols('C1'): 1, sp.symbols('C2'): 1}) plot(assumed_func1, xlim=(0, 10), ylim=(-5, 5), title="u(t)") # 绘制导数u'(t)(修正后) assumed_func2 = sp.diff(u_sol.rhs, t).subs({sp.symbols('C1'): 1, sp.symbols('C2'): 1}) plot(assumed_func2, xlim=(0, 10), ylim=(-5, 5), title="u'(t)")
额外注意事项
- 确保
t是SymPy符号变量(通过sp.symbols('t')定义),而非数值类型; - 常数
C1、C2需通过sp.symbols('C1 C2')明确定义,避免SymPy无法识别; - 若仍有异常,可先打印
assumed_func2确认其为关于t的符号表达式,而非包含错误数值的无效式子。
内容的提问来源于stack exchange,提问作者Kemal159
相关产品推荐
相关产品推荐

