Another thing you can do is use Gröbner bases to obtain an explicit expression for the objective itself. Just add the objective to the previous system, introducing an auxiliary variable s:
Now ask Mathematica to eliminate x,y. It will return you a (horrible) degree 4 polynomial in s. No matter, Julia can handle it:
using Polynomials, LinearAlgebra, Plots
function problem_obj(dim)
z1 = randn(dim)
z2 = randn(dim)
d = randn(dim)
J(t) = norm(z1 * cos(t) + z2 * sin(t) - d)^2
t = -π:0.01:π
values = objective(z1, z2, d)
real_values = real(filter(isreal, values))
real_min = minimum(real_values)
grid_min = minimum(J.(t))
display(plot(t, J.(t)))
return real_min, grid_min
end
function objective(z1, z2, d)
k = dot(z1, z2)
n1 = norm(z1)^2
n2 = norm(z2)^2
w1 = dot(d, z1)
w2 = dot(d, z2)
l = norm(d)^2
c0 =
4 * k^6 + l^4 * (n1 - n2)^2 + (n1^2 - 4w1^2) * (-n1 * n2 + n2^2 + w1^2)^2 + 36k^3 * (2l + n1 + n2) * w1 * w2 -
2 * (n1 * (2n1^3 - 4n1^2 * n2 + n1 * n2^2 + n2^3) + (-10n1^2 + 19n1 * n2 - 10n2^2) * w1^2 + 6w1^4) * w2^2 +
(-8n1^2 + 8n1 * n2 + n2^2 - 12w1^2) * w2^4 - 4w2^6 +
2l^3 * (n1 - n2) * (n1^2 - n2^2 - w1^2 + w2^2) +
4k * w1 * w2 * ((l - n1 + 2n2) * (-((l + 2n1 - n2) * (2l + n1 + n2)) + 9w1^2) + 9 * (l + 2n1 - n2) * w2^2) +
k^4 * (-8l^2 + n1^2 - 10n1 * n2 + n2^2 - 8l * (n1 + n2) - 12 * (w1^2 + w2^2)) +
2l * (
n1^4 * n2 - n1^3 * (n2^2 + w1^2 + 4 * w2^2) +
n2 * (-4w1^2 * (n2^2 + w1^2) + (-n2 + w1) * (n2 + w1) * w2^2 + 5w2^4) -
n1^2 * n2 * (n2^2 + 5 * (w1^2 - 2w2^2)) +
n1 * (n2^4 + 5w1^4 + w1^2 * w2^2 - 4w2^4 + 5n2^2 * (2w1^2 - w2^2))
) +
2k^2 * (
2l^4 - n1^3 * n2 + 4n1^2 * n2^2 - n1 * n2^3 + 4 * l^3 * (n1 + n2) - n1^2 * w1^2 + n1 * n2 * w1^2 -
10n2^2 * w1^2 + 6w1^4 - (10n1^2 - n1 * n2 + n2^2 + 42w1^2) * w2^2 + 6w2^4 -
l * (n1^3 - 5n1^2 * n2 - 5n1 * n2^2 + n2^3 + n1 * w1^2 + 19n2 * w1^2 + (19n1 + n2) * w2^2) +
l^2 * (n1^2 + 10n1 * n2 + n2^2 - 10 * (w1^2 + w2^2))
) +
l^2 * (
n1^4 + 2n1^3 * n2 + n2^4 + (w1^2 + w2^2)^2 - 2n1^2 * (3n2^2 + 4w1^2 + w2^2) - 2n2^2 * (w1^2 + 4w2^2) +
2n1 * n2 * (n2^2 + 5 * (w1^2 + w2^2))
)
c1 =
2 * (
-2l^3 * (n1 - n2)^2 - n1^4 * n2 + n1^3 * n2^2 + n1^2 * n2^3 - n1 * n2^4 +
4k^4 * (2l + n1 + n2) +
n1^3 * w1^2 +
5n1^2 * n2 * w1^2 - 10n1 * n2^2 * w1^2 + 4n2^3 * w1^2 - 5n1 * w1^4 + 4n2 * w1^4 - 36k^3 * w1 * w2 +
(4n1^3 - 10n1^2 * n2 + 5n1 * n2^2 + n2^3 - (n1 + n2) * w1^2) * w2^2 +
(4n1 - 5n2) * w2^4 - 3l^2 * (n1 - n2) * (n1^2 - n2^2 - w1^2 + w2^2) +
l * (
-(n1 - n2)^2 * (n1^2 + 4n1 * n2 + n2^2) + 2 * (4n1^2 - 5n1 * n2 + n2^2) * w1^2 - w1^4 +
2 * (n1^2 - 5n1 * n2 + 4 * n2^2 - w1^2) * w2^2 - w2^4
) - 6k * w1 * w2 * (-2l^2 + n1^2 - 4n1 * n2 + n2^2 - 2l * (n1 + n2) + 3(w1^2 + w2^2)) +
k^2 * (
-8l^3 + n1^3 - 5n1^2 * n2 - 5n1 * n2^2 + n2^3 - 12l^2 * (n1 + n2) +
n1 * w1^2 +
19n2 * w1^2 +
(19n1 + n2) * w2^2 - 2l * (n1^2 + 10n1 * n2 + n2^2 - 10 * (w1^2 + w2^2))
)
)
c2 =
-8k^4 +
24k^2 * l^2 +
24k^2 * l * n1 +
2k^2 * n1^2 +
6l^2 * n1^2 +
6l * n1^3 +
n1^4 +
24k^2 * l * n2 +
20k^2 * n1 * n2 - 12l^2 * n1 * n2 - 6l * n1^2 * n2 +
2n1^3 * n2 +
2k^2 * n2^2 +
6l^2 * n2^2 - 6l * n1 * n2^2 - 6n1^2 * n2^2 +
6l * n2^3 +
2n1 * n2^3 +
n2^4 - 20k^2 * w1^2 - 6l * n1 * w1^2 - 8n1^2 * w1^2 +
6l * n2 * w1^2 +
10n1 * n2 * w1^2 - 2n2^2 * w1^2 + w1^4 - 24k * l * w1 * w2 - 12k * n1 * w1 * w2 - 12k * n2 * w1 * w2 -
20k^2 * w2^2 + 6l * n1 * w2^2 - 2n1^2 * w2^2 - 6l * n2 * w2^2 + 10n1 * n2 * w2^2 - 8n2^2 * w2^2 +
2w1^2 * w2^2 +
w2^4
c3 =
-16k^2 * l - 8k^2 * n1 - 4l * n1^2 - 2n1^3 - 8k^2 * n2 + 8l * n1 * n2 + 2n1^2 * n2 - 4 * l * n2^2 + 2n1 * n2^2 -
2n2^3 + 2n1 * w1^2 - 2n2 * w1^2 + 8k * w1 * w2 - 2n1 * w2^2 + 2n2 * w2^2
c4 = 4k^2 + n1^2 - 2n1 * n2 + n2^2
p = Polynomial([c0, c1, c2, c3, c4])
return roots(p)
end