module Owl_algodiff_numerical:sig..end
Numerical differentiation is subject to truncation error and round-off error.
If you need more precise results, please consider to use Algodiff.AD module
for algorithmic differentiation.
typemat =Owl_dense_matrix_d.mat
typevec =Owl_dense_vector_d.vec
val diff : (float -> float) -> float -> floatdiff f x returns the numrical derivative of a function f : float -> float
at point x. Simply calling diff f will return its derivative function g
of the same type, i.e. g : float -> float.
Keep calling this function will give you higher-order derivatives of f, i.e.
f |> diff |> diff |> diff |> .... However, the error grows quickly due to
the numerical method of differentiation.
val diff2 : (float -> float) -> float -> floatdiff2 f x returns second-order derivative of f : float -> float at x.val grad : (vec -> float) ->
vec -> vecgrad f x returns the gradient of f at point x. Note the type of the
function is f : mat -> float, i.e. f takes an one-row matrix as input and
outputs a float scalar. An exception will be raised if the passed in paramter
is not an one-row matrix.val jacobian : (vec -> vec) ->
vec -> matjacobian f x returns the jacobian of f at point x. Again, the mat
type here refers to one-row matrix. I am still thinking maybe it is necessary
to introduce vector as a separate type in Owl? Currently, the returned result
uses numerator-layout. I.e., if x is n-dimensional and f x is y-dimensional,
then the returned jacobian is an m x n matrix.val jacobianT : (vec -> vec) ->
vec -> matjacobianT f returns the transposed jacobian of f at point x.val diff' : (float -> float) -> float -> float * floatdiff' f x is similar to diff but also returns the function value f x.val diff2' : (float -> float) -> float -> float * floatdiff2' f x is similar to diff2 but also returns the function value f x.val grad' : (vec -> float) ->
vec ->
vec * vecgrad' f x is similar to grad but also returns the function value f x.val jacobian' : (vec -> vec) ->
vec ->
vec * matjacobian' f x is similar to jacobian but also returns the function value f x.val jacobianT' : (vec -> vec) ->
vec ->
vec * matjacobianT' f x is similar to jacobianT but also returns the function value f x.