如果我有一个简单的变量,我可以指定假设或输入如下:
import sympy as sy
k = sy.Symbol('k', integer=True)
assert k.is_integer
assert k.is_real
如果我想对IndexedBase
或Function
执行相同操作该怎么办:
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
但这些都不奏效。这可能吗?
答案 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)
Function
或Indexed
没有语法糖,但你仍然可以通过继承它们来添加假设。 Function('f')
创建了一个名为Function
的{{1}}子类。你可以使用
f
创建一个class f(Function):
is_integer = True
设置为True的子类。
对于is_integer
,您希望继承IndexedBase
,这是您Indexed
时创建的类。
A[i]