如何在Function或IndexedBase的元素上指定假设/类型?

时间:2016-06-24 20:46:34

标签: python sympy

如果我有一个简单的变量,我可以指定假设或输入如下:

import sympy as sy

k = sy.Symbol('k', integer=True)

assert k.is_integer
assert k.is_real

如果我想对IndexedBaseFunction执行相同操作该怎么办:

f = sy.Function('f', integer=True)
t = sy.Symbol('t')
assert f(t).is_integer  # AssertionError
from sympy.tensor import IndexedBase, Idx
i = Idx('i')
A = IndexedBase('A', integer=True)
#  __new__() got an unexpected keyword argument 'integer'
assert A[i].is_integer

但这些都不奏效。这可能吗?

2 个答案:

答案 0 :(得分:1)

旧式假设通过各种机制在SymPy对象的类构造函数中实现。这应该分别为每个SymPy类实现。有些课程没有提供此实现,您无法使用它。

我建议使用新式假设,其中谓词未在对象构造中声明:

In [1]: A = IndexedBase("A")

In [2]: with assuming(Q.positive(A[i])):
   ...:     print ask(Q.real(A[i]))
   ...:     
True

In [3]: with assuming(Q.positive(f(x))):
   ...:     print ask(Q.real(f(x)))
   ...:     
True

也就是说,您创建了一个with assuming( ... )块,在其中假定assuming内声明的假设成立。然后通过逻辑推理来查询ask( ... )中的假设。

不幸的是,许多SymPy算法尚未实现新风格的假设(例如,solve可能会忽略它们。)

答案 1 :(得分:1)

FunctionIndexed没有语法糖,但你仍然可以通过继承它们来添加假设。 Function('f')创建了一个名为Function的{​​{1}}子类。你可以使用

f

创建一个class f(Function): is_integer = True 设置为True的子类。

对于is_integer,您希望继承IndexedBase,这是您Indexed时创建的类。

A[i]