sypy中的实值假设

2024-10-02 00:32:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在sympy中创建实值的变量,因为它只有实部,而不是复杂的,没有虚部。我使用的是Sympy1.0、iPython5.3.0和Python2.7.13。在

In [48]: x = Symbol('x', real=True)
In [49]: x.assumptions0
Out[49]: 
{'commutative': True, 
  'complex': True, 
  'hermitian': True, 
  'imaginary': False, 
  'real': True}
In [50]: x * conjugate(x)
Out[50]: 
 2
x 

结果是正确的,但是它说complex和{}都是{},这让我担心未来的结果。如果我试着让它真实而不复杂,我会得到:

^{pr2}$

然后是一堆回溯信息。显然,这些假设在某种程度上相互冲突,我一定是误解了它们的含义。在

如果我试图确保complex=False我得到:

In [52]: x = Symbol('x', complex=False)
In [53]: x.assumptions0
Out[53]: 
{'algebraic': False,
 'commutative': True,
 'complex': False,
 'composite': False,
 'even': False,
 'imaginary': False,
 'integer': False,
 'irrational': False,
 'negative': False,
 'noninteger': False,
 'nonnegative': False,
 'nonpositive': False,
 'nonzero': False,
 'odd': False,
 'positive': False,
 'prime': False,
 'rational': False,
 'real': False,
 'transcendental': False,
 'zero': False}
In [54]: x * conjugate(x)
Out[54]: 
  _
x⋅x

这清楚地表明它把它当作一个复杂的值来处理。在

我做错什么了吗?我真的可以相信real=True假设变量没有虚部吗?在


Tags: infalsetrueoutsymbolrealsympycomplex
2条回答

这在sympy手册中有明确说明,这里:

http://docs.sympy.org/latest/modules/assumptions/ask.html?highlight=real#sympy.assumptions.ask.AssumptionKeys.real

尤其是

Every real number is also complex.

从数学的角度来看,这是有道理的。在数学意义上,这些“假设”是为了表示符号的属性。所以如果一个数是实数,那就意味着它属于所有实数的集合,这是复平面的一个子集。因此,每一个实数都是一个复数,并且sympy与此相关。您应该可以使用Real=True。在

为了回答第二个问题,conjugate函数没有对它的输入进行任何类型的类型检查,因为它的非复杂输入无论如何都没有意义,假设没有人会给它传递一个不是复数的值。在

非复杂符号的一个例子是非交换变量

>>> A, B = symbols("A B", commutative=False)
>>> A.is_complex
False
>>> A*B
A*B

(顺便说一句,检查对象假设的正确方法是使用is方法,比如is_complex)。在

相关问题 更多 >

    热门问题