2016-06-24 1 views
1

、私は仮定やタイプを指定することができます。FunctionまたはIndexedBaseの要素の前提条件/型をどのように指定しますか?私は単純な変数を持っている場合は、次のよう

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 

しかし、どちらも動作しません。これは可能ですか?

答えて

1

旧式の前提は、さまざまなメカニズムによってSymPyオブジェクトのクラスコンストラクタで実装されます。これは、すべてのSymPyクラスに対して個別に実装する必要があります。いくつかのクラスは、この実装を利用できないため、使用できません。と仮定されているassuming内部で宣言仮定その中

ある
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(...)ブロックを作成します。

私は述語がオブジェクトの構築に宣言されていない新しいスタイルの仮定を、使用することをお勧めホールド。次に、ask(...)の仮定は、論理控除によって照会されます。

残念ながら、新しいスタイルの仮定は、SymPyのアルゴリズムの多くではまだ実装されていません(たとえば、solveは恐らくそれらを無視します)。

0

FunctionまたはIndexedの構文砂糖はありませんが、サブクラス化することで引き続き仮定を追加できます。 Function('f')は、Functionというサブクラスを作成し、fと呼ばれます。

class f(Function): 
    is_integer = True 

is_integerをTrueに設定してサブクラスを作成することができます。

IndexedBaseの場合、サブタイプIndexedは、A[i]を作成したときに作成されるクラスです。

In [11]: i = Idx('i') 

In [12]: class IntegerIndexed(Indexed): 
    ....:  is_integer = True 
    ....: 

In [13]: IntegerIndexed("A", i) 
Out[13]: A[i] 

In [14]: IntegerIndexed("A", i).is_integer 
Out[14]: True 
+0

is_indexed'は '._assumptions'メンバー辞書の検索に解決ちょうどプロパティなので、内部コードは、余分なメンバー – Eric

+0

と設定を'表示されるという保証はありません 'ので、これは、動作しません。 'integer = True'を設定した場合、' real = True'と 'rational = True'を加えて、 – Eric

+0

@Ericはそうではないことを暗に意味するかもしれないので、手動では_assumptionsは素晴らしい考えではありません。上のオブジェクトの場合、自分自身をチェックすることができます。 'is_real'は自動的にTrueに設定されます。 – asmeurer

関連する問題