From c9a3f5ef7cd9bcda70b377b563c0391d6f09b83a Mon Sep 17 00:00:00 2001 From: David Sanders Date: Sun, 10 Feb 2019 10:53:11 -0500 Subject: [PATCH 1/5] Add centered forms for scalar functions --- src/IntervalOptimisation.jl | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/IntervalOptimisation.jl b/src/IntervalOptimisation.jl index 65cd52c..2a84ea0 100644 --- a/src/IntervalOptimisation.jl +++ b/src/IntervalOptimisation.jl @@ -2,16 +2,21 @@ module IntervalOptimisation +using IntervalArithmetic, IntervalRootFinding + + export minimise, maximise, minimize, maximize +export mean_value_form_scalar, third_order_taylor_form_scalar + + include("SortedVectors.jl") using .SortedVectors -using IntervalArithmetic, IntervalRootFinding - include("optimise.jl") +include("centered_forms.jl") const minimize = minimise const maximize = maximise From 7bcf11c461efbb20450ea86ff8eba346952737bf Mon Sep 17 00:00:00 2001 From: David Sanders Date: Sun, 10 Feb 2019 10:59:29 -0500 Subject: [PATCH 2/5] Fix centered forms --- src/IntervalOptimisation.jl | 2 +- src/optimise.jl | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/IntervalOptimisation.jl b/src/IntervalOptimisation.jl index 2a84ea0..3de776a 100644 --- a/src/IntervalOptimisation.jl +++ b/src/IntervalOptimisation.jl @@ -3,7 +3,7 @@ module IntervalOptimisation using IntervalArithmetic, IntervalRootFinding - +using LinearAlgebra export minimise, maximise, minimize, maximize diff --git a/src/optimise.jl b/src/optimise.jl index 4629811..659b4c3 100644 --- a/src/optimise.jl +++ b/src/optimise.jl @@ -1,4 +1,7 @@ +interval_mid(X::Interval) = Interval(mid(X)) +interval_mid(X::IntervalBox) = IntervalBox(mid(X)) + """ minimise(f, X, tol=1e-3) @@ -27,7 +30,7 @@ function minimise(f, X::T, tol=1e-3) where {T} end # find candidate for upper bound of global minimum by just evaluating a point in the interval: - m = sup(f(Interval.(mid.(X)))) # evaluate at midpoint of current interval + m = sup(f(interval_mid(X))) # evaluate at midpoint of current interval if m < global_min global_min = m From 86012d1995252e9ae20fb5034ba2627f7ad00493 Mon Sep 17 00:00:00 2001 From: David Sanders Date: Sun, 10 Feb 2019 22:19:16 -0500 Subject: [PATCH 3/5] Add missing file --- src/centered_forms.jl | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 src/centered_forms.jl diff --git a/src/centered_forms.jl b/src/centered_forms.jl new file mode 100644 index 0000000..689fe24 --- /dev/null +++ b/src/centered_forms.jl @@ -0,0 +1,34 @@ + +import ForwardDiff: gradient, jacobian, hessian + +gradient(f, X::IntervalBox) = gradient(f, X.v) +# jacobian(f, X::IntervalBox) = jacobian(f, X.v) +hessian(f, X::IntervalBox) = hessian(f, X.v) + +""" +Calculate the mean-value form of a function ``f:\\mathbb{R}^n \\to \\mathbb{R}`` +using the gradient ``\nabla f``; +this gives a second-order approximation. +""" +function mean_value_form_scalar(f, X) + m = IntervalBox(mid(X)) + + return f(m) + gradient(f, X) ⋅ (X - m) +end + +mean_value_form_scalar(f) = X -> mean_value_form_scalar(f, X) + + +""" +Calculate a third-order Taylor form of ``f:\\mathbb{R}^n \\to \\mathbb{R}`` using the Hessian. +""" +function third_order_taylor_form_scalar(f, X) + m = IntervalBox(mid(X)) + + H = ForwardDiff.hessian(f, X) + δ = X - m + + return f(m) + gradient(f, m) ⋅ δ + 0.5 * sum(δ[i]*H[i,j]*δ[j] for i in 1:length(X) for j in 1:length(X)) +end + +third_order_taylor_form_scalar(f) = X -> third_order_taylor_form_scalar(f, X) From 3da36ffe8857bafe1d5728658d755167bbfe8a1a Mon Sep 17 00:00:00 2001 From: David Sanders Date: Sun, 10 Feb 2019 22:54:58 -0500 Subject: [PATCH 4/5] Fix 3rd order --- src/centered_forms.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/centered_forms.jl b/src/centered_forms.jl index 689fe24..23fb87e 100644 --- a/src/centered_forms.jl +++ b/src/centered_forms.jl @@ -25,7 +25,7 @@ Calculate a third-order Taylor form of ``f:\\mathbb{R}^n \\to \\mathbb{R}`` usin function third_order_taylor_form_scalar(f, X) m = IntervalBox(mid(X)) - H = ForwardDiff.hessian(f, X) + H = hessian(f, X) δ = X - m return f(m) + gradient(f, m) ⋅ δ + 0.5 * sum(δ[i]*H[i,j]*δ[j] for i in 1:length(X) for j in 1:length(X)) From dc2694b0d88d661c0e53de27a5e706e31310b8da Mon Sep 17 00:00:00 2001 From: David Sanders Date: Sat, 23 Feb 2019 17:25:23 -0600 Subject: [PATCH 5/5] Try directly acting on vector part --- src/centered_forms.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/centered_forms.jl b/src/centered_forms.jl index 23fb87e..8116503 100644 --- a/src/centered_forms.jl +++ b/src/centered_forms.jl @@ -13,7 +13,7 @@ this gives a second-order approximation. function mean_value_form_scalar(f, X) m = IntervalBox(mid(X)) - return f(m) + gradient(f, X) ⋅ (X - m) + return f(m) + gradient(f, X.v) ⋅ (X - m) end mean_value_form_scalar(f) = X -> mean_value_form_scalar(f, X)