如何对SymPy中用户定义函数的衍生物施加限制?

时间:2018-03-07 07:35:51

标签: sympy

我在SymPy中使用用户定义的符号函数。我想在某些点上对这些函数的派生施加某些限制,并且在简化表达式时会自动启动这些限制。

例如,假设我定义了以下函数。

class my_func(Function):
    @classmethod
    def eval(cls, x):
        if x.is_Number:
            if x is S.Zero:
                return S.One
            elif x is S.Infinity:
                return S.Zero

    def _eval_is_real(self):
        return self.args[0].is_real

此函数是从docs中提取的,如果我知道{0}在0点评估为1,则提供了如何使其工作的示例,但是文档没有提供示例如何对衍生品施加类似的条件。

假设众所周知,1 my_func的导数为0,我希望这种简化自动发生。如何将此限制强加于my_func

的定义中

1 个答案:

答案 0 :(得分:1)

文档也有一些examples:衍生工具由函数的fdiff方法实现。您可以指定它应返回的函数(my_func_prime),然后实现该函数的评估。

class my_func(Function):
    # other stuff

    def fdiff(self, argindex):
        return my_func_prime(self.args[0])   
        # argindex (1, 2, 3...) is useful when my_func has multiple variables 

class my_func_prime(Function):
    @classmethod
    def eval(cls, x):
        if x.is_Number:
            if x is S.One:
                return S.Zero      

现在diff(my_func(x)).subs(x, 1)返回0.

总有两个步骤:首先,取导数,然后只用1代替x。我不能像diff(my_func(1))那样做,那只是零。因此,导数的值必须由导数本身实现,而不是由原函数的fdiff方法实现:当导数被采用时,x的值尚未知晓。