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

SymPy中如何通过指定表达式替换实现表达式简化?

解决SymPy中表达式替换失败的问题

针对你遇到的SymPy替换c失败的问题,核心原因是原表达式expr中的目标子项与c的形式未完全匹配,需要先对表达式进行整理或调整替换策略,以下是具体解决方法:

方法一:先简化表达式,再直接替换

原表达式expr经过simplify处理后,会显式出现与c完全一致的子结构,此时subs即可正常工作:

from sympy import Function, symbols, diff, simplify

f = Function('f')
x, y = symbols('x y', real=True)
A, B, C = symbols("A B C")

a = 1/f(x)
b = diff(1/f(x), x)
c = diff(1/f(x), x, 2)

func = 1/f(x)*(1 - f(x)**2*y)
expr = diff(func, x, 2)

# 先简化表达式
expr_simplified = simplify(expr)
# 执行替换
expr_final = expr_simplified.subs(c, C)

print(expr_final)

输出结果:

(2*y*Derivative(f(x), x)**2 + (y*f(x)**2 - 1)*C)/f(x)

方法二:匹配等价子表达式替换

分析c的结构:
c = (-f''(x) + 2*(f'(x))²/f(x))/f(x)²
可推导出等价形式:(f''(x) - 2*(f'(x))²/f(x))/f(x)² = -c

原表达式中存在该等价子项,直接替换此子项为-C即可:

from sympy import Function, symbols, diff, Derivative

f = Function('f')
x, y = symbols('x y', real=True)
A, B, C = symbols("A B C")

a = 1/f(x)
b = diff(1/f(x), x)
c = diff(1/f(x), x, 2)

func = 1/f(x)*(1 - f(x)**2*y)
expr = diff(func, x, 2)

# 定义要匹配的等价子表达式
sub_expr = (Derivative(f(x), (x, 2)) - 2*Derivative(f(x), x)**2/f(x))/f(x)**2
# 替换并整理
expr_final = expr.subs(sub_expr, -C)

print(expr_final)

方法三:使用Wildcard匹配通用结构

如果表达式结构更复杂,可通过Wildcard匹配任意符合c结构的项,提升替换灵活性:

from sympy import Function, symbols, diff, Wild

f = Function('f')
x, y = symbols('x y', real=True)
A, B, C = symbols("A B C")

a = 1/f(x)
b = diff(1/f(x), x)
c = diff(1/f(x), x, 2)

func = 1/f(x)*(1 - f(x)**2*y)
expr = diff(func, x, 2)

# 定义通配符匹配导数项
f_prime = Wild('f_prime')
f_double_prime = Wild('f_double_prime')
# 构建c的匹配模式
c_pattern = (-f_double_prime + 2*f_prime**2/f(x))/f(x)**2
# 执行替换
expr_final = expr.replace(c_pattern, C)

print(expr_final)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 04:27:46