Consider the two rather standard quasi-convex programs in cvxpy:
import cvxpy as cp
The following QCP solves without any trouble:
x1 = cp.Variable()
x2 = cp.Variable()
obj = cp.sqrt(x1) * cp.sqrt(x2)
BC = [ 3 * x1 + x2 <= 100]
prob = cp.problem(cp.Maximize(obj), BC)
prob.solve(scp = True, verbose = True)
Whereas the following fails:
x1 = cp.Variable()
x2 = cp.Variable()
obj = (cp.sqrt(x1) + cp.sqrt(x2)) ** 2
BC = [ 3 * x1 + x2 <= 100]
prob = cp.problem(cp.Maximize(obj), BC)
prob.solve(scp = True, verbose = True)