Skip to main content

calculus and analysis - 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?



Answer



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}*)

Comments

Popular posts from this blog

functions - Get leading series expansion term?

Given a function f[x] , I would like to have a function leadingSeries that returns just the leading term in the series around x=0 . For example: leadingSeries[(1/x + 2)/(4 + 1/x^2 + x)] x and leadingSeries[(1/x + 2 + (1 - 1/x^3)/4)/(4 + x)] -(1/(16 x^3)) Is there such a function in Mathematica? Or maybe one can implement it efficiently? EDIT I finally went with the following implementation, based on Carl Woll 's answer: lds[ex_,x_]:=( (ex/.x->(x+O[x]^2))/.SeriesData[U_,Z_,L_List,Mi_,Ma_,De_]:>SeriesData[U,Z,{L[[1]]},Mi,Mi+1,De]//Quiet//Normal) The advantage is, that this one also properly works with functions whose leading term is a constant: lds[Exp[x],x] 1 Answer Update 1 Updated to eliminate SeriesData and to not return additional terms Perhaps you could use: leadingSeries[expr_, x_] := Normal[expr /. x->(x+O[x]^2) /. a_List :> Take[a, 1]] Then for your examples: leadingSeries[(1/x + 2)/(4 + 1/x^2 + x), x] leadingSeries[Exp[x], x] leadingSeries[(1/x + 2 + (1 - 1/x...

How to thread a list

I have data in format data = {{a1, a2}, {b1, b2}, {c1, c2}, {d1, d2}} Tableform: I want to thread it to : tdata = {{{a1, b1}, {a2, b2}}, {{a1, c1}, {a2, c2}}, {{a1, d1}, {a2, d2}}} Tableform: And I would like to do better then pseudofunction[n_] := Transpose[{data2[[1]], data2[[n]]}]; SetAttributes[pseudofunction, Listable]; Range[2, 4] // pseudofunction Here is my benchmark data, where data3 is normal sample of real data. data3 = Drop[ExcelWorkBook[[Column1 ;; Column4]], None, 1]; data2 = {a #, b #, c #, d #} & /@ Range[1, 10^5]; data = RandomReal[{0, 1}, {10^6, 4}]; Here is my benchmark code kptnw[list_] := Transpose[{Table[First@#, {Length@# - 1}], Rest@#}, {3, 1, 2}] &@list kptnw2[list_] := Transpose[{ConstantArray[First@#, Length@# - 1], Rest@#}, {3, 1, 2}] &@list OleksandrR[list_] := Flatten[Outer[List, List@First[list], Rest[list], 1], {{2}, {1, 4}}] paradox2[list_] := Partition[Riffle[list[[1]], #], 2] & /@ Drop[list, 1] RM[list_] := FoldList[Transpose[{First@li...

front end - keyboard shortcut to invoke Insert new matrix

I frequently need to type in some matrices, and the menu command Insert > Table/Matrix > New... allows matrices with lines drawn between columns and rows, which is very helpful. I would like to make a keyboard shortcut for it, but cannot find the relevant frontend token command (4209405) for it. Since the FullForm[] and InputForm[] of matrices with lines drawn between rows and columns is the same as those without lines, it's hard to do this via 3rd party system-wide text expanders (e.g. autohotkey or atext on mac). How does one assign a keyboard shortcut for the menu item Insert > Table/Matrix > New... , preferably using only mathematica? Thanks! Answer In the MenuSetup.tr (for linux located in the $InstallationDirectory/SystemFiles/FrontEnd/TextResources/X/ directory), I changed the line MenuItem["&New...", "CreateGridBoxDialog"] to read MenuItem["&New...", "CreateGridBoxDialog", MenuKey["m", Modifiers-...