考虑在IPython(Jupyter)笔记本中使用sympy定义的两个变量:
R_g =Symbol(r'R_{g}')
L_g =Symbol(r'L_{g}')
想象一下,我做了一些数学运算,然后我得到了一个复杂的表达式,其特征可用一个简单的例子说明如下:
a=R_g*L_g
print a
打印:
L_{g}*R_{g}
我希望它打印
R_g*L_g
而不是
$ R_g L_g $
原因是我想将此表达式复制粘贴到fortran代码中。这成为一个挑战,因为我使用Latex来格式化变量。所以我必须格式化具有
等变量的术语 IL_np1 =Symbol(r'I_{L}^{n+1}')
答案 0 :(得分:2)
您可以使用自定义符号子类,该子类使用latex()
打印一种方式,使用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
就像
一样In [114]: latex(CustomSymbol('x_2', 'x_{2}'))
Out[114]: 'x_{2}'
In [115]: fcode(CustomSymbol('x_2', 'x_{2}'))
Out[115]: ' x_2'
我已将默认名称设为fcode名称。如果您想要反过来,则可以定义_fcode
而不是_latex
。
答案 1 :(得分:1)
只需恰当地命名您的符号:
R_g = Symbol(r'R_g')
L_g = Symbol(r'L_g')
a = R_g * L_g
print(a)
输出:
R_g*L_g
或手动清理:
>>> 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'