2017-01-27 1 views
1

Considérons deux variables définies à l'aide sympy dans un IPython (Jupyter) portable:Comment imprimer une variable sympy avec son nom dans un carnet IPython?

R_g  =Symbol(r'R_{g}') 
L_g  =Symbol(r'L_{g}') 

Imaginez que je fais des opérations mathématiques puis je me retrouve avec une expression complexe, dont les caractéristiques peut être illustrée par un exemple simple comme suit :

a=R_g*L_g 
print a 

Cette impression:

L_{g}*R_{g} 

Je veux imprimer

R_g*L_g 

et non

$ R_g L_g

$

La raison en est que je veux copier-coller cette expression dans un code Fortran. Cela devient un défi car j'utilise Latex pour formater des variables. Je dois donc termes de format qui ont des variables telles que

IL_np1 =Symbol(r'I_{L}^{n+1}') 

Répondre

1

Vous pouvez utiliser une sous-classe de symboles personnalisés qui imprime d'une manière avec latex() et une autre avec fcode().

class CustomSymbol(Symbol): 
    def __new__(cls, fcode_name, latex_name, **kwargs): 
     x = Symbol.__new__(CustomSymbol, fcode_name, **kwargs) 
     x.latex_name = latex_name 
     return x 

    def _latex(self, printer): 
     return self.latex_name 

Il fonctionne comme

In [114]: latex(CustomSymbol('x_2', 'x_{2}')) 
Out[114]: 'x_{2}' 

In [115]: fcode(CustomSymbol('x_2', 'x_{2}')) 
Out[115]: '  x_2' 

J'ai mis le nom par défaut comme nom de fcode. Si vous le souhaitez dans l'autre sens, vous pouvez définir _fcode au lieu de _latex.

+0

cela semble intéressant. Je vais essayer de revenir – wander95

+0

résultats préliminaires encourageants. Pouvez-vous ou quelqu'un expliquer comment cela a fonctionné? – wander95

+0

@ wander95 Chaque imprimante de SymPy vous permet de définir son comportement sur des objets SymPy personnalisés en définissant une méthode spéciale. Dans ce cas, les méthodes pour les imprimantes LaTeX et Fortran sont respectivement '_latex' et' _fcode'. Voir http://docs.sympy.org/latest/modules/printing.html pour plus de détails. – asmeurer

0

nom juste vos symboles correctement:

R_g = Symbol(r'R_g') 
L_g = Symbol(r'L_g') 
a = R_g * L_g 

print(a) 

Sortie:

R_g*L_g 

Ou nettoyer manuellement:

>>> s = Symbol(r'I_{L}^{n+1}') 
>>> s 
I_{L}^{n+1} 

def make_clean_name(symbol, toremove='{}', replace=None): 
    replace = {'^': '**'} if replace is None else {} 
    return ''.join(replace.get(x, x) for x in symbol.name if x not in toremove) 

>>> make_clean_name(s) 
'I_L**n+1' 
+0

J'essaie d'utiliser l'affichage Latex pour formater les termes, donc j'ai des variables comme 'IL_np1 = Symbole (r'I_ {L}^{n + 1} ')' – wander95

+0

Est-ce que le nettoyage manuel fonctionne pour vous? –