Skip to content

Commit 79d19e4

Browse files
arnavk23tmigot
andauthored
Problem 14 and 15 (#385)
* Problem 14 and 15 --------- Co-authored-by: Tangi Migot <tangi.migot@gmail.com>
1 parent 325f25b commit 79d19e4

File tree

6 files changed

+194
-0
lines changed

6 files changed

+194
-0
lines changed

src/ADNLPProblems/boundary.jl

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
export boundary
2+
3+
function boundary(; use_nls::Bool = false, kwargs...)
4+
model = use_nls ? :nls : :nlp
5+
return boundary(Val(model); kwargs...)
6+
end
7+
8+
function boundary(::Val{:nlp}; n::Int = default_nvar, type::Type{T} = Float64, kwargs...) where {T}
9+
h = 1 // (n + 1)
10+
function f(x; n = length(x))
11+
s = zero(T)
12+
@inbounds for i = 1:n
13+
xm = (i == 1) ? zero(T) : x[i - 1]
14+
xp = (i == n) ? zero(T) : x[i + 1]
15+
s += (2 * x[i] - xm - xp + (h^2 / 2) * (x[i] + i * h + 1)^3)^2
16+
end
17+
return s
18+
end
19+
20+
x0 = Vector{T}(undef, n)
21+
for i = 1:n
22+
x0[i] = i * h * (1 - i * h)
23+
end
24+
25+
return ADNLPModels.ADNLPModel(f, x0, name = "boundary"; kwargs...)
26+
end
27+
28+
function boundary(::Val{:nls}; n::Int = default_nvar, type::Type{T} = Float64, kwargs...) where {T}
29+
h = 1 // (n + 1)
30+
31+
function F!(r, x; n = length(x))
32+
@inbounds for i = 1:n
33+
xm = (i == 1) ? zero(T) : x[i - 1]
34+
xp = (i == n) ? zero(T) : x[i + 1]
35+
r[i] = 2 * x[i] - xm - xp + (h^2 / 2) * (x[i] + i * h + 1)^3
36+
end
37+
return r
38+
end
39+
40+
x0 = Vector{T}(undef, n)
41+
for i = 1:n
42+
x0[i] = i * h * (1 - i * h)
43+
end
44+
45+
return ADNLPModels.ADNLSModel!(F!, x0, n, name = "boundary-nls"; kwargs...)
46+
end

src/ADNLPProblems/variational.jl

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
export variational
2+
3+
function variational(; n::Int = default_nvar, type::Type{T} = Float64, kwargs...) where {T}
4+
h = 1 // (n + 1)
5+
x0 = T[(i * h) * (1 - i * h) for i = 1:n]
6+
7+
function f(x; n = length(x))
8+
Ti = eltype(x)
9+
10+
term1 = zero(Ti)
11+
term2 = zero(Ti)
12+
@inbounds for k = 1:n
13+
xi = x[k]
14+
xip = (k < n) ? x[k + 1] : zero(Ti)
15+
16+
term1 += xi * (xi - xip) / h
17+
18+
a_prev = (k == 1) ? zero(Ti) : x[k - 1]
19+
b_prev = xi
20+
term2 += (exp(b_prev) - exp(a_prev)) / (b_prev - a_prev)
21+
22+
if k == n
23+
a_last, b_last = xi, zero(Ti)
24+
term2 += (exp(b_last) - exp(a_last)) / (b_last - a_last)
25+
end
26+
end
27+
return 2 * (term1 + 2 * h * term2)
28+
end
29+
30+
return ADNLPModels.ADNLPModel(f, x0, name = "variational"; kwargs...)
31+
end

src/Meta/boundary.jl

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
boundary_meta = Dict(
2+
:nvar => 100,
3+
:variable_nvar => true,
4+
:ncon => 0,
5+
:variable_ncon => false,
6+
:minimize => true,
7+
:name => "boundary",
8+
:has_equalities_only => false,
9+
:has_inequalities_only => false,
10+
:has_bounds => false,
11+
:has_fixed_variables => false,
12+
:objtype => :least_squares,
13+
:contype => :unconstrained,
14+
:best_known_lower_bound => -Inf,
15+
:best_known_upper_bound => Inf,
16+
:is_feasible => true,
17+
:defined_everywhere => missing,
18+
:origin => :academic,
19+
)
20+
21+
get_boundary_nvar(; n::Integer = default_nvar, kwargs...) = n
22+
get_boundary_ncon(; n::Integer = default_nvar, kwargs...) = 0
23+
get_boundary_nlin(; n::Integer = default_nvar, kwargs...) = 0
24+
get_boundary_nnln(; n::Integer = default_nvar, kwargs...) = 0
25+
get_boundary_nequ(; n::Integer = default_nvar, kwargs...) = 0
26+
get_boundary_nineq(; n::Integer = default_nvar, kwargs...) = 0
27+
get_boundary_nls_nequ(; n::Integer = default_nvar, kwargs...) = n

src/Meta/variational.jl

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
variational_meta = Dict(
2+
:nvar => 100,
3+
:variable_nvar => true,
4+
:ncon => 0,
5+
:variable_ncon => false,
6+
:minimize => true,
7+
:name => "variational",
8+
:has_equalities_only => false,
9+
:has_inequalities_only => false,
10+
:has_bounds => false,
11+
:has_fixed_variables => false,
12+
:objtype => :other,
13+
:contype => :unconstrained,
14+
:best_known_lower_bound => -Inf,
15+
:best_known_upper_bound => Inf,
16+
:is_feasible => true,
17+
:defined_everywhere => false,
18+
:origin => :academic,
19+
)
20+
21+
get_variational_nvar(; n::Integer = default_nvar, kwargs...) = n
22+
get_variational_ncon(; n::Integer = default_nvar, kwargs...) = 0
23+
get_variational_nlin(; n::Integer = default_nvar, kwargs...) = 0
24+
get_variational_nnln(; n::Integer = default_nvar, kwargs...) = 0
25+
get_variational_nequ(; n::Integer = default_nvar, kwargs...) = 0
26+
get_variational_nineq(; n::Integer = default_nvar, kwargs...) = 0
27+
get_variational_nls_nequ(; n::Integer = default_nvar, kwargs...) = 0

src/PureJuMP/boundary.jl

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# Discrete boundary value problem
2+
#
3+
# Problem 14 in
4+
# L. Luksan, C. Matonoha and J. Vlcek
5+
# Sparse Test Problems for Unconstrained Optimization,
6+
# Technical Report 1064,
7+
# Institute of Computer Science,
8+
# Academy of Science of the Czech Republic
9+
#
10+
# https://www.researchgate.net/publication/325314400_Sparse_Test_Problems_for_Unconstrained_Optimization
11+
export boundary
12+
13+
function boundary(; n::Int = default_nvar, kwargs...)
14+
h = 1 // (n + 1)
15+
model = Model()
16+
x0 = [i * h * (1 - i * h) for i = 1:n]
17+
@variable(model, x[i = 1:n], start = x0[i])
18+
@objective(
19+
model,
20+
Min,
21+
sum(
22+
(
23+
2 * x[i] - (i == 1 ? 0 : x[i - 1]) - (i == n ? 0 : x[i + 1]) +
24+
(h^2 / 2) * (x[i] + i * h + 1)^3
25+
)^2 for i = 1:n
26+
)
27+
)
28+
return model
29+
end

src/PureJuMP/variational.jl

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# Discretization of a variational problem
2+
#
3+
# Problem 15 in
4+
# L. Luksan, C. Matonoha and J. Vlcek
5+
# Sparse Test Problems for Unconstrained Optimization,
6+
# Technical Report 1064,
7+
# Institute of Computer Science,
8+
# Academy of Science of the Czech Republic
9+
#
10+
# https://www.researchgate.net/publication/325314400_Sparse_Test_Problems_for_Unconstrained_Optimization
11+
export variational
12+
13+
function variational(; n::Int = default_nvar, kwargs...)
14+
h = 1 // (n + 1)
15+
x0 = [(i * h) * (1 - i * h) for i = 1:n]
16+
model = Model()
17+
@variable(model, x[i = 1:n], start = x0[i])
18+
19+
@objective(
20+
model,
21+
Min,
22+
2 * (
23+
(sum(x[i] * (x[i] - x[i + 1]) / h for i 1:(n - 1)) + x[n] * x[n] / h) +
24+
2 * h *
25+
(
26+
(exp(x[1]) - exp(0)) / (x[1] - 0) +
27+
sum((exp(x[j + 1]) - exp(x[j])) / (x[j + 1] - x[j]) for j 1:(n - 1)) +
28+
(exp(0) - exp(x[n])) / (0 - x[n])
29+
)
30+
)
31+
)
32+
33+
return model
34+
end

0 commit comments

Comments
 (0)