f[k_, z_] = E^(-k*z)*(1 + k*z);
Direct calculation using Nest
dOp1[f_, n_Integer?NonNegative] :=
Nest[z*D[#, z] &, f, n]
Simplify
at each step to reduce number of terms to be differentiated
dOp2[f_, n_Integer?NonNegative] :=
Nest[Simplify[z*D[#, z]] &, f, n]
Transform for straightforward differentiation rather than differential operator
dOp3[f_, n_Integer?NonNegative] :=
D[f /. z -> E^z, {z, n}] /. z -> Log[z]
Equivalent series expansion
dOp4[f_, n_Integer?NonNegative] :=
Sum[StirlingS2[n, i]*z^i*D[f, {z, i}], {i, n}]
Comparing performance of the different approaches
m = 15;
g1 = dOp1[f[k, z], m]; // AbsoluteTiming
(* {0.153352, Null} *)
g2 = dOp2[f[k, z], m]; // AbsoluteTiming
(* {0.11716, Null} *)
g3 = dOp3[f[k, z], m]; // AbsoluteTiming
(* {0.102199, Null} *)
g4 = dOp4[f[k, z], m]; // AbsoluteTiming
(* {0.000697, Null} *)
Verifying that all results are the same
g1 == g2 == g3 == g4 // Simplify
(* True *)
Relative efficiency varies depending on order (n
) and specific function (f
).