Conjugate of piecewise function
In this post, we’ll show how to calculate the conjugate of a piecewise function ,
such as
The conjugate for the above is:
where is the conjugate of the function
constrained to
. So, computing the conjugate of a piecewise function is simple as long as the conjugates of the sub-functions can be computed easily.
Conjugate of constrained function
In this section, we’ll show how to calculate the convex conjugate of a function , which is the function
which is constrained to a domain
.
The conjugate is defined as:
For the unconstrained case, the solution would be given by:
where is the derivative of
. Since
is convex,
is a monotonically increasing function. Therefore, we have
The conjugate of the constrained function is therefore:
The convex conjugate for the unconstrained function can be automatically calculated in Python — as described in the previous post.
Code that do the above is given below:
def calc_const_conj(fun_str, lstr='l', ustr='u', varnames='x l u', fname='plot.png'): # set the symbols vars = sp.symbols(varnames) x = vars[0] if isinstance(vars, tuple) else vars y = sp.symbols('y', real=True) # set the function and objective fun = parse_expr(fun_str) obj = x*y - fun fun_diff = sp.diff(fun, x) obj_diff = sp.diff(obj, x) l = parse_expr(lstr) u = parse_expr(ustr) # calculate yl and yu yl = sp.simplify(fun.subs(x, l)) yu = sp.simplify(fun.subs(x, u)) dyl = sp.simplify(fun_diff.subs(x, l)) dyu = sp.simplify(fun_diff.subs(x, u)) # calculate derivative of obj and solve for zero sol = solve(obj_diff, x) # substitute solution into objective solfun = sp.collect(sp.simplify(obj.subs(x, sol[0])), x) # print the function and conjugate: print('{0:45} y < {1}'.format(str(sp.simplify(l*y - yl)), dyl)) print('{0:45} {1} <= y <= {2}'.format(str(solfun), dyl, dyu)) print('{0:45} y > {1}'.format(str(sp.simplify(u*y - yu)), dyu)) # Example: calc_const_conj('1/2*x**2', lstr='-1', ustr='1', varnames='x')
Table of conjugates
Function | Constraint | Conjugate | ||
Linear | ![]() |
![]() |
![]() |
|
Simple Quadratic | ![]() |
![]() |
![]() |
|
Quadratic | ![]() |
![]() |
![]() |
|
PE-like | ![]() |
![]() |
![]() |
|
Hinge | ![]() |
![]() |
||
(scaled)Hinge | ![]() |
![]() |