школьники говорят, что на сборах по математике для 11 класса рассказывали про производные многочленов без пределов через «предпроизводную» — тоже дело, но мне больше нравится кое-что другое
что такое производная многочлена P? очень просто: если ε²=0, то P(x+ε)=P(x)+εP'(x)
ср. с обычным «(f(x+ε)-f(x))/ε→f'(x) при ε→0» — только теперь никаких пределов не осталось, только алгебра в кольце чисел вида a+bε с соотношением ε²=0
эту алгебру «дуальных чисел» легко реализовать — вот всё, по сути, что нужно для такого автоматического дифференцирования:
class Dual:
def __init__(self, a, b=0):
self.a, self.b = a, b
def __add__(self, other):
return Dual(self.a + other.a, self.b + other.b)
def __mul__(self, other):
return Dual(self.a * other.a, self.a * other.b + self.b * other.a)
def diff(f, x):
return f(Dual(x, 1)).b
ну технически, если сейчас написать
def poly(x):
return x**2-3*x-1
print(diff(poly,1))
то вместо производной многочлена в единице мы увидим, что возведение дуальных чисел в степень не определено, умножение дуальных чисел на обычные неопределено, вычитание не определено… более технически полноценное определение класса положу в комментарии
***
в связи с дуальными числами можно говорить еще про разную геометрию — так, если умножение на комплексные числа отвечает за повороты, то дуальные числа реализуют любимые мной перекашивания: exp(εt)(x+yε) = x+(y+xt)ε… а также, говорят, реализуют параболические повороты, но эта часть что-то плохо пока в голову уложилась