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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 00:53:37