Комментарии 11
Эта техника называется автоматическим дифференцированием, и не предполагает никаких операций, кроме базовой арифметики и стандартных действий над матрицами.
Почему не предполагает? Для функций, в том числе и вложенных, автоматическое дифференцирование тоже работает, я проверял.
Использование матриц вместо суммы
может показаться усложнением, но матричная алгебра, в отличие от реализации дуальных чисел, есть в инструментарии большинства языков программирования, в пакетах символьных вычислений и даже в некоторых калькуляторах (как например в том, которым я пользуюсь на своём телефоне)
Это одна из причин, по которой я замахнулся на ориентированный на математику свой собственный язык программирования) В Wolfram-е работать с нестандартными числами в алгебраическом виде в принципе удобно, но есть свои ограничения в синтаксисе для новых операторов и некоторые нюансы связанные с делением, степенью и некоммутативным умножением.
Если кому-то интересно, как работать с дуальными числами в Mathematica:
Определение в ООП стиле
ClearAll[d]
(*преобразовать в список*)
d /: Extract[d[b_, c_]] := Simplify[{b, c}]
(*привести к алгебраическому виду*)
d /: Algebraic[d[x_, b_]] := Simplify[x + э b]
(*сложение*)
d /: d[x_, b_] + k_ := d[x + k, b]
(**)
d /: d[x_, b_] + d[y_, a_] := d[x + y, b + a]
(**)
d /: d[x_, b_] - d[y_, a_] := d[x - y, b - a]
(*умножение на константу*)
d /: d[x_, b_]*k_ := d[x k, b k]
(*умножение*)
d /: d[x_, b_]*d[y_, a_] := d[x y, x a + b y]
(*комплексно-сопряжённое умножение*)
d /: d[x_, b_] ** d[y_, a_] := d[y x, -x a + b y]
(*деление*)
d /: d[x_, b_]/d[y_, a_] := d[x/y, (-x a + b y)/y^2]
(*масштабирующее умножение*)
d /: Scale[d[x_, b_], d[y_, a_]] := d[x y, b a]
(*возведение в действительную степень*)
d /: d[x_, b_]^n_ := d[x^n, n b x^(n - 1)]
(*возведение в степень c действительным основанием*)
d /: Power[x_, d[y_, b_]] := d[x^y, b x^y Log[x]]
(*возведение в степень*)
d /: Power[d[x_, b_], d[y_, a_]] :=
d[x^y, x^(-1 + y) (b y + a x Log[x])]
(*экспонента*)
d /: Exp[d[x_, b_]] := d[E^x, b E^x]
(*логарифм*)
d /: Log[d[x_, b_]] := d[Log[x], b/x]
(*логарифм с произвольным действительным основанием*)
d /: Log[n_, d[x_, b_]] := d[Log[n, x], b/(x Log[n])]
(*логарифм с произвольным основанием*)
d /: Log[d[c_, n_, a_], d[x_, b_]] :=
d[Log[n, x], (-x a Log[x] + b n Log[n])/(x n Log[n]^2)]
(*тригонометрия*)
d /: Sin[d[x_, b_]] := d[Sin[x], b Cos[x]]
d /: Cos[d[x_, b_]] := d[Cos[x], -b Sin[x]]
d /: Tan[d[x_, b_]] := d[Tan[x], b Sec[x]^2]
d /: ArcSin[d[x_, b_]] := d[ArcSin[x], b/Sqrt[1 - x^2]]
d /: ArcCos[d[x_, b_]] := d[ArcCos[x], -b/Sqrt[1 - x^2]]
d /: ArcTan[d[x_, b_]] := d[ArcTan[x], b/(1 + x^2)]
d /: Sinh[d[x_, b_]] := d[Sinh[x], b Cosh[x]]
d /: Cosh[d[x_, b_]] := d[Cosh[x], b Sinh[x]]
d /: Tanh[d[x_, b_]] := d[Tanh[x], b Sech[x]^2]
d /: ArcSinh[d[x_, b_]] := d[ArcSinh[x], b/Sqrt[1 + x^2]]
d /: ArcCosh[d[x_, b_]] := d[ArcCosh[x], b/Sqrt[-1 + x^2]]
d /: ArcTanh[d[x_, b_]] := d[ArcTanh[x], b/(1 - x^2)]
d /: Csc[d[x_, b_]] := d[1/Sin[x], -b Cot[x] Csc[x]]
d /: Sec[d[x_, b_]] := d[1/Cos[x], b Sec[x] Tan[x]]
d /: Cot[d[x_, b_]] := d[1/Tan[x], -b Csc[x]^2]
Ну а затем пишем Sin[Sin[d[x,1]]]
и вуаля - получаем производную d[Sin[Sin[x]], Cos[x] Cos[Sin[x]]]
(а если численно считать, то вместо x конкретное число конечно же).
На достигнутом можно не останавливаться и вторую производную тоже считать автоматически
d/:d[a_,b_,c_]+d[x_,y_,z_]:=d[a+x,b+y,c+z]
d/:d[a_,b_,c_]-d[x_,y_,z_]:=d[a-x,b-y,c-z]
d/:d[a_,b_,c_]*d[x_,y_,z_]:=d[a x,b x+a y,c x+2 b y+a z]
d/:d[u_,v_,w_]/d[x_,y_,z_]:=d[u/x,(v x-u y)/x^2,(w x^2-2v x y+2u y^2-u x z)/x^3]
И третью
d/:d[a_,b_,c_,u_]+d[x_,y_,z_,v_]:=d[a+x,b+y,c+z,u+v]
d/:d[a_,b_,c_,u_]*d[x_,y_,z_,v_]:=d[a x,b x+a y,c x+2 b y+a z,a v+u x+3 c y+3 b z]
d/:d[e_,f_,g_,h_]/d[x_,y_,z_,v_]:=d[e/x,(f x-e y)/x^2,(g x^2-2 f x y+2 e y^2-e x z)/x^3,(x(h x^2-3g x y+6 f y^2-3 f x z)-e(v x^2+6 y^3-6 x y z))/x^4]
И так далее, даже обобщённые формулы для этого попадались.
В модели рациональных чисел всё наоборот: сложение выглядит как линейная комбинация, а умножение — как поэлементное перемножение.
Не совсем "честно". Рациональное число в этой модели это не конкретная пара, а целый класс эквивалентности "пропорциональных" пар.
Спасибо за весь цикл статей.
Пора переходить к групповым алгебрам и неприводимым представлениям групп
Из зрительского зала раздаётся неуверенный "Бис".
Аудитория терпеливо ждёт того единственного момента, когда автор представит миру гера Грассмана!
Математическая продлёнка. Изобретаем параболические числа