简化 sympy.sympify 给出的表达式

J.P*_*iez 3 python sympy

当您的表达式由 sp.sympify 给出时,sp.simplify 似乎不起作用。我怎样才能改变这一点?

\n
import sympy as sp\n\nr = sp.Symbol('r', real = True)\nf_str = 'sqrt(1/r**4)'\n\nf1 = sp.sympify( f_str )\nf2 = sp.sqrt(1/r**4)\n\nfor f in f1,f2:\n    sp.pprint(sp.simplify(f))\n
Run Code Online (Sandbox Code Playgroud)\n

哪个输出

\n
     ____\n    \xe2\x95\xb1 1  \n   \xe2\x95\xb1  \xe2\x94\x80\xe2\x94\x80           # f1\n  \xe2\x95\xb1    4 \n\xe2\x95\xb2\xe2\x95\xb1    r  \n\n1 \n\xe2\x94\x80\xe2\x94\x80                 # f2\n 2\nr \n
Run Code Online (Sandbox Code Playgroud)\n

我期望给定一个实值 (r),sympify 表达式可以得到简化

\n

Bri*_*ian 6

inr与您定义的符号f1不同r

>>> f1.free_symbols == f2.free_symbols
False
Run Code Online (Sandbox Code Playgroud)

特别是,这意味着真实的假设r不成立,这对于您想要的简化是必要的。

您可以通过用您的符号替换rin来补救此事后分析:f1r

>>> f1                # old r, no assumptions
sqrt(r**(-4))

>>> f1.subs("r", r)   # your r, with real assumption
r**(-2)  
Run Code Online (Sandbox Code Playgroud)

一般来说,您可以通过传递将字符串符号映射到所需 SymPy 符号的字典来在构造时指定字符串输入的假设:

>>> f3 = sp.sympify(f_str, {"r": r})

>>> f3
r**(-2)

>>> f3.free_symbols == f2.free_symbols
True
Run Code Online (Sandbox Code Playgroud)