当您的表达式由 sp.sympify 给出时,sp.simplify 似乎不起作用。我怎样才能改变这一点?
\nimport 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))\nRun 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 \nRun Code Online (Sandbox Code Playgroud)\n我期望给定一个实值 (r),sympify 表达式可以得到简化
\ninr与您定义的符号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)