首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为sympy.Derivative创建自定义打印

为sympy.Derivative创建自定义打印
EN

Stack Overflow用户
提问于 2019-11-28 15:58:10
回答 1查看 159关注 0票数 1

假设我有一个函数f(x,y),我希望f w.r.t的偏导数为x,以\partial_{x}^{n} f(x,y)的形式出现,因此我创建了以下类

代码语言:javascript
复制
class D(sp.Derivative):
    def _latex(self,printer=None):
        func = printer.doprint(self.args[0])
        b = self.args[1]
        if b[1] == 1 :
            return r"\partial_{%s}%s"%(printer.doprint(b[0]),func)
        else :
            return r"\partial_{%s}^{%s}%s"%(printer.doprint(b[0]),printer.doprint(b[1]),func)

它工作得很好,但当我使用doit()方法计算导数时,它又回到了默认行为。假设我有

代码语言:javascript
复制
x,y = sp.symbols('x,y')
f = sp.Function('f')(x,y)

然后,sp.print_latex(D(f,x))给出\partial_{x}f{\left(x,y \right)},这是正确的,但sp.print_latex(D(x*f,x).doit())产生x \frac{\partial}{\partial x} f{\left(x,y \right)} + f{\left(x,y \right)},这是旧的行为。如何解决此问题?

EN

回答 1

Stack Overflow用户

发布于 2019-11-28 18:21:59

问题是您没有覆盖父类中的doit,而且它返回的是纯Derivative对象,而不是您的子类。我建议创建一个新的Derivative类,而不是创建一个新的打印机类:

代码语言:javascript
复制
from sympy import *

from sympy.printing.latex import LatexPrinter

class MyLatexPrinter(LatexPrinter):
    def _print_Derivative(self, expr):
        differand, *(wrt_counts) = expr.args
        if len(wrt_counts) > 1 or wrt_counts[0][1] != 1:
            raise NotImplementedError('More code needed...')
        ((wrt, count),) = wrt_counts
        return '\partial_{%s} %s)' % (self._print(wrt), self._print(differand))

x, y = symbols('x, y')
f = Function('f')
expr = (x*f(x, y)).diff(x)

printer = MyLatexPrinter()

print(printer.doprint(expr))

这给了x \partial_{x} f{\left(x,y \right)}) + f{\left(x,y \right)}

您可以使用init_printing(latex_printer=printer.doprint)将其设置为默认输出。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59084096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档