Skip to content

Commit 5e7b762

Browse files
committed
Add centered forms for scalar functions
1 parent e44dad6 commit 5e7b762

File tree

4 files changed

+44
-3
lines changed

4 files changed

+44
-3
lines changed

Project.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ uuid = "c7c68f13-a4a2-5b9a-b424-07d005f8d9d2"
33
version = "0.4.2"
44

55
[deps]
6+
ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210"
67
IntervalArithmetic = "d1acc4aa-44c8-5952-acd4-ba5d80a2a253"
8+
IntervalRootFinding = "d2bf35a9-74e0-55ec-b149-d360ff49b807"
9+
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
710

811
[compat]
912
IntervalArithmetic = "0.15, 0.16, 0.17"

src/IntervalOptimisation.jl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ module IntervalOptimisation
33
export minimise, maximise,
44
minimize, maximize
55
export HeapedVector, SortedVector
6+
export mean_value_form_scalar, third_order_taylor_form_scalar
67

78
include("StrategyBase.jl")
89
using .StrategyBase
@@ -13,10 +14,11 @@ using .SortedVectors
1314
include("HeapedVectors.jl")
1415
using .HeapedVectors
1516

16-
using IntervalArithmetic
17+
using IntervalArithmetic, IntervalRootFinding
18+
using LinearAlgebra
1719

1820
include("optimise.jl")
19-
21+
include("centered_forms.jl")
2022

2123
const minimize = minimise
2224
const maximize = maximise

src/centered_forms.jl

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import ForwardDiff: gradient, jacobian, hessian
2+
3+
gradient(f, X::IntervalBox) = gradient(f, X.v)
4+
# jacobian(f, X::IntervalBox) = jacobian(f, X.v)
5+
hessian(f, X::IntervalBox) = hessian(f, X.v)
6+
7+
"""
8+
Calculate the mean-value form of a function ``f:\\mathbb{R}^n \\to \\mathbb{R}``
9+
using the gradient ``\nabla f``;
10+
this gives a second-order approximation.
11+
"""
12+
function mean_value_form_scalar(f, X)
13+
m = IntervalBox(mid(X))
14+
15+
return f(m) + gradient(f, X.v) (X - m)
16+
end
17+
18+
mean_value_form_scalar(f) = X -> mean_value_form_scalar(f, X)
19+
20+
21+
"""
22+
Calculate a third-order Taylor form of ``f:\\mathbb{R}^n \\to \\mathbb{R}`` using the Hessian.
23+
"""
24+
function third_order_taylor_form_scalar(f, X)
25+
m = IntervalBox(mid(X))
26+
27+
H = hessian(f, X)
28+
δ = X - m
29+
30+
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))
31+
end
32+
33+
third_order_taylor_form_scalar(f) = X -> third_order_taylor_form_scalar(f, X)

src/optimise.jl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
numeric_type(::Interval{T}) where {T} = T
22
numeric_type(::IntervalBox{N, T}) where {N, T} = T
33

4+
interval_mid(X::Interval) = Interval(mid(X))
5+
interval_mid(X::IntervalBox) = IntervalBox(mid(X))
6+
47
"""
58
minimise(f, X, structure = SortedVector, tol=1e-3)
69
or
@@ -37,7 +40,7 @@ function minimise(f, X::T; structure = HeapedVector, tol=1e-3) where {T}
3740
end
3841

3942
# find candidate for upper bound of global minimum by just evaluating a point in the interval:
40-
m = sup(f(Interval.(mid.(X)))) # evaluate at midpoint of current interval
43+
m = sup(f(interval_mid(X))) # evaluate at midpoint of current interval
4144

4245
if m < global_min
4346
global_min = m

0 commit comments

Comments
 (0)