实现特殊功能的简化规则

时间:2017-05-31 11:17:48

标签: sympy

我在Sympy中定义了两个自定义函数,名为phiPhi。我知道Phi(x)+Phi(-x) == 1。如何为Sympy提供此简化规则?我可以在我的班级定义中指定这个吗?

这是我到目前为止所做的:

from sympy import Function


class phi(Function):

    nargs = 1

    def fdiff(self, argindex=1):
        if argindex == 1:
            return -1*self.args[0]*phi(self.args[0])
        else:
            raise ArgumentIndexError(self, argindex)

    @classmethod
    def eval(cls, arg):
        # The function is even, so try to pull out factors of -1
        if arg.could_extract_minus_sign():
            return cls(-arg)


class Phi(Function):

    nargs = 1

    def fdiff(self, argindex=1):
        if argindex == 1:
            return phi(self.args[0])
        else:
            raise ArgumentIndexError(self, argindex)

对于好奇的人来说,phiPhi分别代表高斯PDF和CDF。这些是在sympy.stats中实现的。但是,就我而言,根据phiPhi来解释结果会更容易。

1 个答案:

答案 0 :(得分:3)

根据Stelios的评论,如果Phi(x)为否定,则1-Phi(-x)应返回x。因此,我修改了Phi如下:

class Phi(Function):

    nargs = 1

    def fdiff(self, argindex=1):
        if argindex == 1:
            return phi(self.args[0])
        else:
            raise ArgumentIndexError(self, argindex)

    @classmethod
    def eval(cls, arg):
        # Phi(x) + Phi(-x) == 1
        if arg.could_extract_minus_sign():
            return 1-cls(-arg)