From b2d008a927f6915e60e30007c6181215ec7e8068 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=A1vio=20Ribeiro?= Date: Sun, 16 Aug 2015 01:12:28 +0200 Subject: [PATCH 1/2] included complex step finite method for the gradient computation --- src/finite_difference.jl | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/finite_difference.jl b/src/finite_difference.jl index 34a39e4..03937fe 100644 --- a/src/finite_difference.jl +++ b/src/finite_difference.jl @@ -129,8 +129,17 @@ function finite_difference!{S <: Number, T <: Number}(f::Function, x[i] = oldx g[i] = (f_xplusdx - f_xminusdx) / (epsilon + epsilon) end + elseif dtype == :complex + xcomplex = x + 0.*im + for i = 1:n + @complexrule x[i] epsilon + oldxi = xcomplex[i] + xcomplex[i] = oldxi + epsilon * im + g[i] = imag(f(xcomplex)) / epsilon + xcomplex[i] = oldxi + end else - error("dtype must be :forward or :central") + error("dtype must be :forward, :central or :complex") end return From 6a5f47812156dcabf328ff42d7dd43285a2effbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=A1vio=20Ribeiro?= Date: Tue, 18 Aug 2015 23:18:06 +0200 Subject: [PATCH 2/2] solves a problem for derivative when x = 0 --- src/finite_difference.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/finite_difference.jl b/src/finite_difference.jl index 03937fe..669b328 100644 --- a/src/finite_difference.jl +++ b/src/finite_difference.jl @@ -38,7 +38,7 @@ end macro complexrule(x, e) x, e = esc(x), esc(e) quote - $e = eps($x) + $e = eps($x + 1e-200) end end