Skip to content
Advertisement

Is it possible to assign a symbol of partial derivative via symbols() in SymPy?

I would like to symbolically represent one of variables as a partial derivative like:

dF_dx = symbols(‘dF/dx’)

so that display(dF_dx) would show it as:

enter image description here

Is there a way to do it? The official reference is not very clear to a newbie. Thank you.

Advertisement

Answer

_print_Derivative currently decides based on requires_partial if it’s going to use the rounded d symbol or not. The requires_partial function checks how many free symbols the expression is using, if it’s using more than one symbol then it will use the rounded d symbol, otherwise it will just use d instead.

To override this behaviour, we can just pass a custom LatexPrinter class to init_printing

from sympy import *
from sympy.printing.latex import LatexPrinter
from sympy.core.function import _coeff_isneg, AppliedUndef, Derivative
from sympy.printing.precedence import precedence, PRECEDENCE

class CustomPrint(LatexPrinter):
    def _print_Derivative(self, expr):
        diff_symbol = r'partial'

        
        tex = "" 
        dim = 0
        for x, num in reversed(expr.variable_count):
            dim += num
            if num == 1:
                tex += r"%s %s" % (diff_symbol, self._print(x))
            else:
                tex += r"%s %s^{%s}" % (diff_symbol,
                                        self.parenthesize_super(self._print(x)),
                                        self._print(num))

        if dim == 1:
            tex = r"frac{%s}{%s}" % (diff_symbol, tex) 
        else:
            tex = r"frac{%s^{%s}}{%s}" % (diff_symbol, self._print(dim), tex) 

        if any(_coeff_isneg(i) for i in expr.args):
            return r"%s %s" % (tex, self.parenthesize(expr.expr,
                                                  PRECEDENCE["Mul"],
                                                  is_neg=True,
                                                  strict=True))

        return r"%s %s" % (tex, self.parenthesize(expr.expr,
                                                  PRECEDENCE["Mul"],
                                                  is_neg=False,
                                                  strict=True))
        
def custom_print_func(expr, **settings):
    return CustomPrint().doprint(expr)
    
    
x = symbols('x')
F = Function('F')(x)
init_printing(use_latex=True,latex_mode="plain",latex_printer=custom_print_func)

dF_dx = F.diff(x)

display(dF_dx)

OUTPUT:

enter image description here


See this post as well on how to use a custom latex printer.

All the code in this post is available in this repo.

User contributions licensed under: CC BY-SA
8 People found this is helpful
Advertisement