SymPy中sympify生成的表达式无法被simplify有效简化的问题咨询
SymPy中sympify生成的表达式无法被simplify有效简化的问题咨询
我之前也碰到过类似的问题,其实这是因为sympify解析字符串表达式时的细节处理导致的——虽然你已经定义了r为实数符号,但默认情况下sympify解析字符串时可能没有充分利用这个实数属性,或者解析后的表达式结构和直接用SymPy函数构造的存在差异,进而影响了simplify的效果。
下面给你几个可行的解决办法:
方法一:解析时明确传入已定义的符号
调用sympify时,通过locals参数指定使用你已经定义好的带real=True属性的符号r,避免解析器重新生成默认的无属性符号:import sympy as sp r = sp.Symbol('r', real=True) f_str = 'sqrt(1/r**4)' # 传入locals参数关联已定义的r f1 = sp.sympify(f_str, locals={'r': r}) f2 = sp.sqrt(1/r**4) for f in f1, f2: sp.pprint(sp.simplify(f))方法二:使用更灵活的
parse_expr替代sympify
SymPy的parse_expr函数在表达式解析上更智能,能更好地识别当前命名空间里的符号属性,替换后也能得到预期的简化结果:f1 = sp.parse_expr(f_str, local_dict={'r': r})方法三:针对性简化+强化符号属性
如果上面的方法还不生效,可以尝试使用更针对性的简化函数(比如powsimp),或者给符号添加更具体的属性(比如positive=True,如果你的r是正实数的话):# 给r添加positive属性 r = sp.Symbol('r', real=True, positive=True) f1 = sp.sympify(f_str) # 使用powsimp进行幂相关的简化 sp.pprint(sp.powsimp(sp.simplify(f1)))
修改后你会发现,f1的输出也会变成1/r²,和f2一致。
备注:内容来源于stack exchange,提问作者J.Pottiez
相关产品推荐
相关产品推荐

