Gramacy & Lee Function

the Gramacy & Lee function is a continuous function. It is not convex. The function is defined on a 1-dimensional space. It is unimodal. The function can be defined on any input domain, but it is usually evaluated on $x \in [-0.5, 2.5]$.

The Gramacy & Lee is as follows: $f(x) = \frac{\sin(10\pi x)}{2x} + (x-1)^4$.

Let's import these two packages Surrogates and Plots:

using Surrogates
using SurrogatesPolyChaos
using Plots

Now, let's define our objective function:

function gramacylee(x)
    term1 = sin(10 * pi * x) / (2 * x)
    term2 = (x - 1)^4
    y = term1 + term2
end
gramacylee (generic function with 1 method)

Let's sample f in 25 points between -0.5 and 2.5 using the sample function. The sampling points are chosen using a Sobol sample, this can be done by passing SobolSample() to the sample function.

n = 25
lower_bound = -0.5
upper_bound = 2.5
x = sample(n, lower_bound, upper_bound, SobolSample())
y = gramacylee.(x)
xs = lower_bound:0.001:upper_bound
scatter(x, y, label = "Sampled points", xlims = (lower_bound, upper_bound),
    ylims = (-5, 20), legend = :top)
plot!(xs, gramacylee.(xs), label = "True function", legend = :top)
Example block output

Now, let's fit Gramacy & Lee function with different surrogates:

my_pol = PolynomialChaosSurrogate(x, y, lower_bound, upper_bound)
loba_1 = LobachevskySurrogate(x, y, lower_bound, upper_bound)
krig = Kriging(x, y, lower_bound, upper_bound)
scatter(x, y, label = "Sampled points", xlims = (lower_bound, upper_bound),
    ylims = (-5, 20), legend = :top)
plot!(xs, gramacylee.(xs), label = "True function", legend = :top)
plot!(xs, my_pol.(xs), label = "Polynomial expansion", legend = :top)
plot!(xs, loba_1.(xs), label = "Lobachevsky", legend = :top)
plot!(xs, krig.(xs), label = "Kriging", legend = :top)
Example block output