SymPy平方根简化

12

我有一个表达式,我认为可以简化一些,但是不知道为什么sympy没有执行我认为的简单简化。下面是我的代码和示例:

# coding: utf-8

# In[1]:

from __future__ import division
from sympy import *
init_printing()

# In[3]:

d, R, c = symbols('d R c', Positive = True, Real = True)
Δt = symbols('\Delta_t', Real = True)

# In[4]:

Δt = (1/c**2)*(-R*c+sqrt(c**2*(R+d)**2))
Δt

# In[5]:

simplify(Δt)

我已经将代码放在上面,方便复制粘贴... iPython的图形输出如下:

enter image description here

我本来期望最终结果会是这样的:

enter image description here

我认为根据我定义变量的方式,简化应该会发生,至少sqrt((R+d)**2)... 我做错了什么?

我在创建变量时指定了(Positive = True,Real = True)。至少我认为当我添加这些选项时是这样做的... - Justace Clutter
2个回答

21

尝试使用real = Truepositive = True(小写):

import sympy as sp

d, R, c = sp.symbols('d R c', positive = True, real = True)
dt = sp.symbols('\Delta_t', real = True)

dt = (1/c**2)*(-R*c+sp.sqrt(c**2*(R+d)**2))

print(sp.simplify(dt))

输出:

d/c

3

为了进一步解释@user5402的回答,SymPy默认只对一般复数有效的简化进行操作。特别地,sqrt(x**2) = x在一般情况下不成立。只有当x是正数时才成立。将x设置为Symbol('x', positive=True)告诉SymPy这是正确的情况。


你知道为什么使用parse_expr时同样的事情不起作用吗?做x = symbols('x',positive = True,real = True)和expr = simplify(parse_expr("sqrt(x2)"))返回"sqrt(x2)"而不是"x"。 - JohnDoe122
parse_expr 创建新的符号。如果你想要重复使用之前定义的 x,你需要使用 parse_expr('sqrt(x**2), locals()) - asmeurer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接