Most of the second_derivative stuff in derivative.jl could probably be ripped out, and have it directly call finite_difference_hessian(f, x). Indeed, that gets you those two extra orders of magnitude in precision, because finite_difference_hessian uses exactly this kind of scaling rule.
--Tim On Monday, January 20, 2014 10:40:28 AM Hans W Borchers wrote: > I looked into the *Calculus* package and its derivative functions. First, I > got errors when running examples from the README file: > > julia> second_derivative(x -> sin(x), pi) > ERROR: no method eps(DataType,) > in finite_difference at > /Users/HwB/.julia/Calculus/src/finite_difference.jl:27 > in second_derivative at /Users/HwB/.julia/Calculus/src/derivative.jl:67 > > Then I was a bit astonished to see not too accurate results such as > > julia> abs(second_derivative(sin, 1.0) + sin(1.0)) > 6.647716624952338e-7 > > while, when applying the standard central formula for second derivatives, > (f(x+h) - 2*f(x) + f(x-h)) / h^2 with the (by theory) suggested step length > eps^0.25 (for second derivatives) will result in a much better value: > > julia> h = eps()^0.25; > > julia> f = sin; x = 1.0; > > julia> df = (sin(x+h) - 2*sin(x) + sin(x-h)) / h^2 > -0.8414709866046906 > > julia> abs(df + sin(1.0)) > 1.7967940468821553e-9 > > The functions for numerical differentiation in *Calculus* look quite > involved, maybe it would be preferable to apply known approaches derived > from Taylor series. Even the fourth order derivative will in this case lead > to an absolute error below 1e-05!
