2016-09-02 1 views
1

J'essaie d'évaluer une certaine expression en tenant compte de l'hypothèse. Plus précisément, mon problème est lié aux objets indexedBase.Sympy: Utilisation de "hypothèses" pour évaluer par morceaux, spécifiquement pour IndexedBase

Voir le code suivant:

from sympy import * 
init_printing(use_latex="mathjax") 


ntot = symbols("n_tot", integer = True) 
i = Idx("i",(1,ntot)) 
k = Idx("k", (1,ntot)) 
j = Idx("j",(1,ntot)) 
x = IndexedBase("x") 

À titre d'exemple, prenons la dérivée de deux sommations sur x [i].

expr = Sum(Sum(x[i],(i,1,ntot)),(k,1,ntot)).diff(x[j]) 

(NOTE: ce n'est pas possible dans la version actuelle sympy 1.0, il est possible avec la version de développement et sera disponible dans les prochaines sympy versions stables.)

Je veux évaluer la expression et obtenir une réponse piecewise:

print(expr.doit()) 
OUTPUT: n_tot*Piecewise((1, And(1 <= j, j <= n_tot)), (0, True)) 

donc mon problème est, comment puis-je dire sympy que je sais avec certitude que j est compris entre 1 et ntot. Alors que mon résultat est 1:

J'ai essayé les suivants, mais sans succès:

with assuming(j==2): 
    expr=Sum(Sum(x[i],(i,1,ntot)),(k,1,ntot)).diff(x[j]).doit() 

Répondre

3

Les hypothèses sur les inégalités sont une caractéristique cruellement défaut dans sympy.

Techniquement, l'objet Idx a été créé pour permettre à un symbole de contenir une plage de définition, afin de mettre des limites sur les symboles indexés. Votre j a déjà ces informations:

In [28]: j.upper 
Out[28]: n_tot 

In [29]: j.lower 
Out[29]: 1 

Malheureusement, la classe d'inégalité ne vise pas à gérer Idx objets, de sorte que sa gamme se disregared.

Vous pouvez réellement essayer:

In [32]: simplify(expr.doit()).args[0][0] 
Out[32]: n_tot 

Cet extrait manuellement le premier terme de l'expression Piecewise.

Évidemment, l'algorithme actuel doit être amélioré, il faut déjà dire à Sum que j est dans la plage correcte pour donner 1 comme résultat.

+0

Merci Francesco. Au moins je sais que ce n'est actuellement pas possible et peut continuer. THX. – Johannes