# Optimization over a bi-linear function

For the function

$$f(x_1,x_2;a_0,b_0)=\\\small\cases{\frac{1}{2}\left[x_1+x_2-x_1x_2+\left(\frac{-1+b_0(1-a_0)}{a_0}x_1+1\right)\left(\frac{-1+b_0(1-a_0)}{a_0}x_2+1\right)\right],\quad 0 \leq x_1\leq a_0,\, 0 \leq x_2\leq a_0\\ \frac{1}{2}\left[x_1+x_2-x_1x_2+\left(\frac{-1+b_0(1-a_0)}{a_0}x_1+1\right)b_0(-x_2+1)\right],\quad\quad\,\,\,\,\,\quad 0 \leq x_1\leq a_0,\, a_0 \leq x_2\leq 1\\ \frac{1}{2}\left[x_1+x_2-x_1x_2+b_0(-x_1+1)\left(\frac{-1+b_0(1-a_0)}{a_0}x_2+1\right)\right],\quad\quad\,\,\,\,\quad a_0 \leq x_1\leq 1,\, 0 \leq x_2\leq a_0\\ \frac{1}{2}\left[x_1+x_2-x_1x_2+b_0(-x_1+1)b_0(-x_2+1)\right],\quad\quad\quad\quad\quad\quad\quad a_0 \leq x_1\leq 1,\, a_0 \leq x_2\leq 1}$$

and

$$f(x_1=x_2;a_0,b_0)=\cases{\frac{1}{2}\left[2x_1-{x_1}^2+\left(1+\frac{x_1(1+b_0(1-a_0))}{a_0}\right)^2\right],\quad 0 \leq x_1 \leq a_0\\\frac{1}{2}\left[2x_1+b_0^2(1-x_1)^2-x_1^2\right],\quad\quad\quad\quad\,\quad a_0 \leq x_1 \leq 1}$$

I would like to solve the following optimization problem:

$$\max_{a_0,b_0\in[0,1]}\left[\min_{{x_1=x_2\in[0,1]}}f(x_1,x_2;a_0,b_0) -\min_{{x_1,x_2\in[0,1]}}f(x_1,x_2;a_0,b_0)\right]$$

Here is my code for the function $f$:

f[x1_, x2_] := Piecewise[{{(1/2)*(x1 + x2 - x1*x2 + ((-1 + b0*(1 - a0)) x1/a0 +  1) ((-1 + b0*(1 - a0)) x2/a0 + 1)), 0 <= x1 <= a0 && 0 <= x2 <= a0}, {(1/2)*(x1 + x2 - x1*x2 + ((-1 + b0*(1 - a0)) x1/a0 + 1)*b0 (-x2 + 1)), 0 <= x1 <= a0 && a0 <= x2 <= 1}, {(1/2)*(x1 + x2 - x1*x2 + ((-1 + b0*(1 - a0)) x2/a0 + 1)*b0 (-x1 + 1)), a0 <= x1 <= 1 && 0 <= x2 <= a0}, {(1/2)*(x1 + x2 - x1*x2 + b0 (-x1 + 1)*b0 (-x2 + 1)), a0 <= x1 <= 1 && a0 <= x2 <= 1}}]


Would it be possible also to solve this analytically with Mathematica?

• I cannot find conditions concerning b0 in your function definition, something seems to be wrong! – Ulrich Neumann Aug 3 '18 at 9:46
• @UlrichNeumann please see the problem definition. $a_0$ and $b_0$ are in $[0,1]$. Does this clarify your question? – Seyhmus Güngören Aug 3 '18 at 9:51
• Unfortunately not. The restriction 0<b0<1 doesn't appear in your Piecewise-function. For numerical optimization your function must return a numerical value! – Ulrich Neumann Aug 3 '18 at 10:27
• @UlrichNeumann you said optimization and for optimization you already have it. I don't understand you at all. The function can be general and I may be interested in making an optimization for some certain part of this function. Forget the function $f$ completely. Just insert this function in to the problem definition. Then delete the function $f$. Now you have a problem which is valid and independent of $f$. – Seyhmus Güngören Aug 3 '18 at 10:33
• Sorry for trying to help: I adapted your function definition f[x1_ ?NumericQ, x2_?NumericQ , a0 _?NumericQ , b0_?NumericQ ]:=... .The test f[.9, .8, 0.1, .7] keeps unevaluated. So any numerical programm cannot succeed – Ulrich Neumann Aug 3 '18 at 10:47

It is a minmax-problem which you can solve numerically as follows:

f[x1_?NumericQ, x2_?NumericQ, a0_?NumericQ, b0_?NumericQ ] :=
Piecewise[{{(1/2)*(x1 + x2 -x1*x2 + ((-1 + b0*(1 - a0)) x1/a0 +1) ((-1 + b0*(1 - a0)) x2/a0 + 1)),
0 <= x1 <= a0 && 0 <= x2 <= a0},
{ (1/2)*(x1 + x2 - x1*x2 + ((-1 + b0*(1 - a0)) x1/a0 + 1)*b0 (-x2 + 1)),
0 <= x1 <= a0 &&a0 < x2 <=1},
{(1/2)*(x1 + x2 -x1*x2 + ((-1 + b0*(1 - a0)) x2/a0 + 1)*b0 (-x1 + 1)),
a0 < x1 <= 1 &&0 <= x2 <=a0},
{(1/2)*(x1 + x2 - x1*x2 + b0 (-x1 + 1)*b0 (-x2 + 1)),
a0 < x1 <= 1 && a0 < x2 <= 1}}, 0]


You need two functions for the inner -minimization:

jeq [a0_?NumericQ, b0_?NumericQ] :=NMinimize[{f[x, x, a0, b0], 0 < x < 1}, x][[1]]
juq [a0_?NumericQ, b0_?NumericQ] :=NMinimize[{f[x1, x2, a0, b0], 0 < x1 < 1, 0 < x2 < 1}, {x1, x2}][[1]]


Now your problem can be formulated as

max=NMaximize[ {jeq[a0, b0] - juq[a0, b0], {0 <= a0 <= 1,0 <= b0 <= 1}}, {a0, b0}]
(* after 10 minutes: {0.293779, {a0 -> 0.415495, b0 -> 0.00202345}}*)


The values x,x1,x2 for optimal a0,b0 are

NMinimize[{f[x, x, a0, b0] /. max[[2]], 0 < x < 1}, x] [[2]]
(*{x -> 0.293779}*)
NMinimize[{f[x1, x2, a0, b0] /. max[[2]], 0 < x1 < 1,0 < x2 < 1}, {x1, x2}][[2]]
(*{x1 -> -2.16855*10^-28, x2 -> 0.417829}*)

• Thank you very much for the answer. Wow, 10 minutes! It means If I have more variables then I will have troubles.. – Seyhmus Güngören Aug 3 '18 at 11:40
• Would it be possible to get $x_1$ and $x_2$ just at the output of the optimization? I run the same code as you posted and got surprisingly a different result. a0=0.911439 and b0=0.808984 and the maximum value is 0.495. I have version 10.3. I think both results are problematic. I just checked your result and I found $x_1=x_2=0.2935$ and $x__1=0.4155$ with $x_2=0$. For this the result is $0.086$. – Seyhmus Güngören Aug 3 '18 at 13:43
• One more thing: I have the feeling that your result for $a_0$ and $b_0$ are almost correct. I guess $a_0=0.4155$ and $b_0=0$ should be the correct values. – Seyhmus Güngören Aug 3 '18 at 14:01
• The function jeq[a0, b0] - juq[a0, b0] you try to maximize seems to be very complicated. I tried a Plot3d[jeq[a0, b0] - juq[a0, b0],...] but mathematica didn't finish the plot after 1hour... – Ulrich Neumann Aug 3 '18 at 14:28
• Thank you very much. – Seyhmus Güngören Aug 3 '18 at 22:25