(* Differentiation with explanation *) (* (C) Alexander Frolkin 2001 *) (* alexander@frolkin.demon.co.uk *) BeginPackage["EDiff`"] (* Set attributes *) (* SetAttributes[EDiff, HoldAll] *) (* Brief description *) EDiff::usage := "EDiff[f, x] gives the derivative of f with respect to x, explaining what is is doing." (* A few standard derivatives *) EDiff[a_, x_] := (Print[Constant]; 0) /; FreeQ[a, x] EDiff[x_, x_] := (Print[Diffx]; 1) EDiff[x_^n_, x_] := (Print[Power]; n x^(n-1)) /; FreeQ[n, x] EDiff[Log[x_], x_] := (Print[Log]; 1/x) EDiff[Sin[x_], x_] := (Print[Sin]; Cos[x]) EDiff[Cos[x_], x_] := (Print[Cos]; -Sin[x]) (* Separate rule for E^x isn't needed - it's handled by Logdiff :-) *) (* Differentiation rules *) EDiff[f_ g_, x_] := (Print[Product]; f EDiff[g, x] + g EDiff[f, x]) EDiff[f_/g_, x_] := (Print[Quotient]; (g EDiff[f, x] - f EDiff[g, x])/g^2) EDiff[f_[g_], x_] := (Print[Chain]; EDiff[f[g], g] EDiff[g, x]) EDiff[f_^g_, x_] := (Print[Logdiff]; f^g EDiff[g Log[f], x]) EndPackage[ ]