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

如何在SymPy中替换符号表达式中的未定义函数

SymPy中替换复合函数phi(r²)的问题

问题场景

在SymPy中处理依赖于r²的未知函数phi时,常规替换方法无法将其替换为具体函数并得到正确结果,具体示例如下:

复合函数求导示例

from sympy import symbols, Function

r = symbols('r', real=True)
phi = r * Function('phi')(r**2)
dphi = phi.diff(r)
print(dphi)

输出结果:

2*r**2*Subs(Derivative(phi(_xi_1), _xi_1), _xi_1, r**2) + phi(r**2)

当需要替换phi(y)=y时,预期结果为3*r**3,但直接替换无法实现;同时,单变量函数的替换逻辑在复合函数上失效:

单变量函数替换(可行)

from sympy import symbols, Function, sin

r = symbols('r', real=True)
phi = Function('phi')(r)
om = r * phi
dom = om.diff(r)
print(dom.subs(phi, sin(r)).doit())

输出:

r*cos(r) + sin(r)

复合函数替换(失效)

from sympy import symbols, Function, sin

r = symbols('r', real=True)
phi = Function('phi')(r**2)
om = r * phi
dom = om.diff(r)
print(dom.subs(phi, sin(r)).doit())

输出仍保留未解析的Subs项,未得到预期的2*r**2*cos(r**2) + sin(r**2)。


解决方法

问题核心是:复合函数求导后生成的Subs(Derivative(...))代表phi’(r²),直接替换phi(r**2)无法覆盖导数部分,必须同时替换原函数和其导数。

正确实现代码

示例1:替换phi(y)=y

from sympy import symbols, Function

r = symbols('r', real=True)
y = symbols('y')
# 先定义phi为y的函数,再代入y=r²
phi_func = Function('phi')(y)
phi = r * phi_func.subs(y, r**2)
dphi = phi.diff(r)

# 同时替换phi(y)和其导数phi’(y)
result = dphi.subs([(phi_func, y), (phi_func.diff(y), 1)]).doit()
print(result)

输出:

3*r**3

示例2:替换phi(y)=sin(y)

from sympy import symbols, Function, sin, cos

r = symbols('r', real=True)
y = symbols('y')
phi_func = Function('phi')(y)
phi = r * phi_func.subs(y, r**2)
dom = phi.diff(r)

# 同时替换phi(y)和其导数phi’(y)
result = dom.subs([(phi_func, sin(y)), (phi_func.diff(y), cos(y))]).doit()
print(result)

输出:

2*r**2*cos(r**2) + sin(r**2)

关键说明

  • 引入中间变量y明确phi的自变量,可避免复合函数层级混淆
  • 必须显式替换函数的导数部分,因为SymPy不会自动关联原函数替换与导数替换

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 09:15:29