For a one-variable numerical function, it's simple to calculate the derivative at a point with Derivative
as Szabolcs has pointed out before:
f[x_?NumericQ] := x^2
f'[3.]
(* 6. *)
But this fails for partial derivatives:
g[x_?NumericQ, y_?NumericQ, z_?NumericQ] = x y z + x^2 y^2 z
Derivative[1, 0, 0][g][1., 1., 1.]
(* 3. *)
Derivative[1, 1, 1][g][2., 3., 4.]
(* Unevaluated: Derivative[1, 1, 1][g][2., 3., 4.] *)
ND
seems to only handle the one-dimensional case.
Using SeriesCoefficient
simply returns the (scaled) Derivative
expression:
SeriesCoefficient[g[x, y, z], {x, 2., 1}, {y, 3., 1}, {z, 4., 1}]
(* Derivative[1, 1, 1][g][2., 3., 4.] *)
I'd prefer not to clutter my code with finite difference formulas, since this functionality must be in Mathematica somewhere; where is it?
EDIT: The closest I've found so far is NDSolve`FiniteDifferenceDerivative
, but that works on grids and it's a hassle to use for other purposes. Anyone know of a convenient C/Java library that links well with Mathematica and handles all kinds of numerical differentiation?
EDIT2: Does Derivative
have accuracy control? (step size or anything)
Clear @ f
f[x_?NumericQ] = Exp[x];
Array[Abs[Derivative[#1][f][1.] - E] &, {8}]
$$\left( \begin{array}{c|c|c} \text{n} & \text{seconds} & \text{error} \\ \hline 5 & 0.123 & 6.77\times 10^{-7} \\ 6 & 0.297 & 0.0000484 \\ 7 & 0.592 & 0.0127 \\ 8 & 1.05 & 1.11 \\ \end{array} \right)$$
ND
is freely visible (it's inAddOns/Packages/NumericalCalculus/NLimit.m
). $\endgroup$