Fractional optimization
=======================
This notebook shows how to solve a simple *concave fractional problem*,
in which the objective is to maximize the ratio of a nonnegative concave
function and a positive convex function. Concave fractional problems are
quasiconvex programs (QCPs). They can be specified using disciplined
quasiconvex programming
(`DQCP `__), and hence
can be solved using CVXPY.
.. code::
!pip install --upgrade cvxpy
.. code::
import cvxpy as cp
import numpy as np
import matplotlib.pyplot as plt
Our goal is to maximize the function
.. math:: \frac{\sqrt{x}}{\exp(x)}.
This function is not concave, but it is quasiconcave, as can be seen by
inspecting its graph.
.. code::
plt.plot([np.sqrt(y) / np.exp(y) for y in np.linspace(0, 10)])
plt.show()
.. image:: concave_fractional_function_files/concave_fractional_function_4_0.png
The below code specifies and solves the QCP, using DQCP. The concave
fraction function is DQCP-compliant, because the ratio atom is
quasiconcave (actually, quasilinear), increasing in the numerator when
the denominator is positive, and decreasing in the denominator when the
numerator is nonnegative.
.. code::
x = cp.Variable()
concave_fractional_fn = cp.sqrt(x) / cp.exp(x)
problem = cp.Problem(cp.Maximize(concave_fractional_fn))
assert problem.is_dqcp()
problem.solve(qcp=True)
.. parsed-literal::
0.4288821220397949
.. code::
x.value
.. parsed-literal::
array(0.50000165)