如何定义可调用的派生函数

时间:2019-11-18 15:58:34

标签: python-3.x

对于我正在从事的项目,我正在创建一类可以执行的多项式。多项式类可以执行加,减,乘,合成除法等操作。它也可以正确地表示它。

对于该项目,我们需要为牛顿方法创建一个类。我能够为f创建一个可调用的函数类,这样

>f=polynomial(2,3,4)
>f
2+3x+4x^2
>f(3)
47

我有一个派生函数polynomial.derivative(f)输出3+8x

我想定义一个标记为Df的函数,以便在我的牛顿方法代码中可以说Df(x)。如果x = 2:

>Df(2)
19

1 个答案:

答案 0 :(得分:1)

多项式的导数仍然是多项式。因此,您的3+8x函数应该返回一个新的polynomial.derivative,而不是返回字符串polynomial

class polynomial:
   def __init__(c, b, a):
       self.coefs = [c, b, a]

   [...]
   def derivative(self):
       return polynomial(*[i*c for i,c in enumerate(self.coefs) if i > 0], 0)

因此,您可以按以下方式使用它:

> f = polynomial(2, 3, 4)
> Df = f.derivative()
> f
2+3x+4x^2
> Df
3+8x+0x^2
> f(3)
47
> Df(2)
19

编辑

当然是enumerate,而不是enumerates。同样,__init__错过了self参数。我直接在SO上编写了代码,而没有任何语法检查。

您当然可以在.py文件中编写。这是一个完整的工作示例:

class Polynomial:
    def __init__(self, c, b, a):
        self.coefs = [c, b, a]
        self._derivative = None

    @property
    def derivative(self):
        if self._derivative is None:
            self._derivative = Polynomial(*[i*c for i,c in enumerate(self.coefs) if i > 0], 0)
        return self._derivative

    def __str__(self):
        return "+".join([
            str(c) + ("x" if i > 0 else "") + (f"^{i}" if i > 1 else "")
            for i, c in enumerate(self.coefs)
            if c != 0
        ])

    def __call__(self, x):
        return sum([c * (x**i) for i, c in enumerate(self.coefs)])


if __name__ == '__main__':
    f = Polynomial(2, 3, 4)
    print(f"f: y={f}")
    print(f"f(3) = {f(3)}")
    print(f"f': y={f.derivative}")
    print(f"f'(2) = {f.derivative(2)}")
f: y=2+3x+4x^2
f(3) = 47
f': y=3+8x
f'(2) = 19

您可以使用自己喜欢的名称重命名该属性:derivativeDfprime等。