The code of minimize_constrained starts checking if the first argument is a symbolic expression. If this were the case, it gets the variables on which such an expression depends. Then the code generates a function whose argument is a vector, needed for any subsequent computation; each variable of the expression is replaced by a component of the vector. For example, if the expression is x^2+y, the variables are x and y. The code defines a function whose argument is a vector, say p, which yields p[0]^2+p[1].
When $f(x,y)=x$, the expression f(x,y) has only one variable, which is x, and so the function defined inside minimize_constrained does not depend on a vector with two components, as required, raising errors.
To use minimize_constrained, I would advise to directly define Python functions depending on vectors, either with def or lambda. For example, for $f(x,y)=x+y$, we can write
def f(x): return x[0] + x[1]
def c(x): return 1 - x[0]^2 - x[1]^2
or also
f = lambda x: x[0] + x[1]
c = lambda x: 1 - x[0]^2 - x[1]^2
In both cases, we get:
sage: minimize_constrained(f, c, [0,0])
(-0.7071774954004159, -0.7070360740443554)
Likewise, for $f(x,y)=x$, we have:
sage: f = lambda x: x[0]
sage: c = lambda x: 1 - x[0]^2 - x[1]^2
sage: minimize_constrained(f, c, [0,0])
(-1.0000000049989504, 9.999999987505248e-05)
which is the expected result.
If, for clarity, you prefer to explicitly define functions in terms of x and y, you can still do that:
sage: f = lambda x,y: x
sage: c = lambda x,y: 1 - x^2 - y^2
sage: ff = lambda p: f(*p)
sage: cc = lambda p: c(*p)
sage: minimize_constrained(ff, cc, [0,0])
(-1.0000000049989504, 9.999999987505248e-05)
This is a bug, indeed. Comes from using "f.variables()" in
minimize_constrained.I have created https://trac.sagemath.org/ticket/31065