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

如何在定义f后让Derivative(f(x), x)返回显式值?

解决SymPy中先定义导数再指定函数形式时无法得到显式导数的问题

你遇到的问题核心是变量赋值的先后逻辑导致导数对象未更新:

  • 当执行f = sp.Function('f')('x')时,f是一个未绑定具体表达式的符号函数,此时df = f.diff(x)生成的是一个记录“对符号函数f(x)求导”的Derivative对象。
  • 后续f = sp.sin(x)只是把变量f重新赋值为正弦函数,但这不会修改已经创建的df对象内部的符号引用,所以df仍然指向最初的符号函数求导结构,自然输出Derivative(f(x), x)。

方法一:先定义函数显式形式,再求导(推荐)

这是最直观的写法,先确定函数的具体表达式,再对其求导:

import sympy as sp
x = sp.symbols('x')
f = sp.sin(x)  # 先指定f的显式形式
df = f.diff(x)  # 对显式函数求导
print(df)

执行后会直接输出cos(x),符合预期。

方法二:先定义导数结构,再替换符号函数(适合必须先声明导数场景)

如果需要先构建导数的逻辑结构,再后续指定函数形式,需要明确区分符号函数和具体表达式变量,通过subs替换符号函数后执行求导:

import sympy as sp
x = sp.symbols('x')
f_sym = sp.Function('f')(x)  # 单独存储符号函数对象
df = f_sym.diff(x)
f_expr = sp.sin(x)  # 定义函数的具体表达式
# 替换符号函数为具体表达式,并用doit()触发求导计算
df_evaluated = df.subs(f_sym, f_expr).doit()
print(df_evaluated)

这里用f_sym保存最初的符号函数,避免和后续的具体表达式变量混淆,替换后doit()会执行实际的求导运算,最终输出cos(x)。

为什么之前的subs/doit无效?

你之前的尝试失败,是因为错误地用变量f(此时已经是sin(x))去替换df中的符号函数f(x),但df内部引用的是最初创建的sp.Function('f')(x)对象,和后来赋值的变量f没有关联,所以替换无法生效。必须直接针对符号函数对象sp.Function('f')(x)进行替换。

内容的提问来源于stack exchange,提问作者user15933

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 03:59:59