I’m trying to maximize a function f(t_1, t_2) for which the first order conditions yield 2 equations depending on some conditions. The FOCs divide the plane into 3 regions, where t_1 > t_2, where t_1 < t_2, and where t_1 = t_2. I am solving each of those systems of equations for each of those cases, but there are cases that are not feasible for given parameters, so I have to handle possible errors when I feed the solver a system that is not feasible.
I am struggling to find a MWE, but I hope this example can convey the essence of the problem. For simplicity, let us consider only the regions where t_1 > t_2, and where t_1 < t_2.
using Optim
using Roots
function H(s; θ=θ)
s^2 - θ
end
function N(t1, t2; θ=θ)
-((t1 - 10)^2 + (t2 - 10)^2) + θ
end
function foc_t1t2(t2bound; θ=θ)
t1star = find_zero(t1 -> H(t1; θ=θ), (0.0, 100_000.0))
solt2 = optimize(t2 -> -N(t1star, t2; θ=θ), t1star, t2bound, Optim.Brent())
t2star = solt2.minimizer
return [t1star, t2star]
end
function foc_t2t1(t1bound; θ=θ)
t2star = find_zero(t2 -> H(t2; θ=θ), (0.0, 100_000.0))
solt1 = optimize(t1 -> -N(t1, t2star; θ=θ), t2star, t1bound, Optim.Brent())
t1star = solt1.minimizer
return [t1star, t2star]
end
function sol_foc(; θ1=θ1, θ2=θ2, K1=K1, K2=K2)
# bounds
H1inv(y1) = Roots.find_zero(t1 -> H(t1; θ=θ1) + K1 - y1, (0.0, 100_000.0))
t1bound = H1inv(K1)
H2inv(y2) = Roots.find_zero(t2 -> H(t2; θ=θ2) + K2 - y2, (0.0, 100_000.0))
t2bound = H2inv(K2)
sol_t1t2 = [NaN, NaN]
try
sol_t1t2 .= foc_t1t2(t2bound; θ=θ1)
catch
@info "t1 < t2 not feasible"
end
sol_t2t1 = [NaN, NaN]
try
sol_t2t1 .= foc_t2t1(t1bound; θ=θ2)
catch
@info "t2 < t1 not feasible"
end
# test which one yields largest value
trueval = -Inf
truezero = [NaN, NaN]
for v in (sol_t1t2, sol_t2t1)
n = N(v...; θ=θ1+θ2)
if trueval < n
trueval = n
truezero .= v
end
end
return truezero
end
θ1 = 0
θ2 = 2
K1 = 0
K2 = 100
those parameters then yield this
julia> sol_foc(; θ1=θ1, θ2=θ2, K1=K1, K2=K2)
[ Info: t2 < t1 not feasible
2-element Vector{Float64}:
0.0
1.4142135410861298
I’m looking to see if there is a better (more performant) way of dealing with those exceptions.