I'm trying to solve a non-linear min-max systems using the below code. and i'm geeting this error
Error using symengine
Input arguments must be convertible to floating-point numbers.
Error in sym/privBinaryOp (line 1030)
Csym = mupadmex(op,args{1}.s, args{2}.s, varargin{:});
Error in sym/min (line 78)
C = privBinaryOp(X, Y, 'symobj::zipWithImplicitExpansion', 'symobj::minComplex');
Any suggestions to fix it?
syms x111 x114 x121 x124 x211 x214 x221 x224
eq1 = min((min(3*x111,8*x111)+min(2*x211,11*x211)),(6*min(3*x111,8*x111)+6*min(2*x211,11*x211)))+min((7*min(3*x121,8*x121)+7*min(2*x221,11*x221)),(-3*max(3*x124,8*x124)-3*max(2*x224,11*x224)))+min((2*min(x111,7*x111)+2*min(3*x211,7*x211)),(-5*max(x114,7*x114)-5*max(3*x214,7*x214)))+min((min(x121,7*x121)+min(3*x221,7*x221)),(5*min(x121,7*x121)+5*min(2*x221,7*x221)))==-964;
eq2 = min ((6* min (3* x111, 8 *x111)+6* min (2* x211, 11 *x211)),(-max (3*x114, 8* x114) -max (2* x214, 11* x214)))+min ((min (3 *x121, 8* x121)+min (2* x221, 11* x221)),(7* min (3* x121, 8* x121)+7 *min (2 *x221, 11 *x221)))+ min ((3 *min (x111, 7* x111)+3 *min (3* x211, 7* x211)), (6 *min (x111, 7* x111)+6* min (3 *x211, 7* x211)))+min ((4 *min (x121, 7 *x121) +4 *min (3* x221, 7* x221)),(-3 *max (x124, 7 *x124) -3* max (3* x224, 7 *x224)))== -793;
eq3 = min ((min (-8 *x114, -x114) +min (-4 *x214, 6* x211)), (6 *min (-8* x114, -x114) +6 *min (-4* x214, 6* x211)))+min ((7* min (-8* x124, -x124) +7* min (-4* x224, 6* x221)), (-3* max (-x121, -8* x121) -3* max (6* x224, -4* x221)))+min ((2* min (-5* x114, -x114) +2* min (-6 *x214, 2* x211)), (-5* max (-x111, -5* x111) -5* max (2* x214, -6* x211)))+min ((min (-5* x124, -x124) +min (-6* x224, 2* x221)), (5* min (-5* x124, -x124) +5 *min (-6* x224, 2* x221))) == -1331;
eq4 = min ((6* min (-8* x114, -x114) +6* min (-4 *x214, 6* x211)), (-max (-x111, -8* x111) -max (6* x214, -4* x211)))+min ((min (-8* x124, -x124) +min (-4 *x224, 6* x221)), (7* min (-8* x124, -x124) +7 *min (-4* x224, 6* x221)))+min ((3* min (-5* x114, -x114) +3* min (-6* x214, 2* x211)), (6* min (-5* x114, -x114) +6* min (-6* x214, 2* x211)))+min ((4* min (-5 *x124, -x124) +4* min (-6* x224, 2* x221)), (-3* max (-x121, -5* x121) -3* max (2* x224, -6* x221))) == -1476;
eq5 = max ((max (3* x114, 8* x114) +max (2* x214, 11* x214)), (6* max (3* x114, 8* x114) +6 *max (2 *x214, 11 *x214)))+max ((-3 *min (3 *x121, 8* x121) -3* min (2 *x221, 11* x221)), (7 *max (3* x124, 8* x124) +7* max (2* x224, 11* x224)))+max ((-5* min (x111, 7* x111) -5 *min (3* x211, 7* x211)), (2 *max (x114, 7 *x114) + 2* max (3* x214, 7* x214)))+max ((max (x124, 7 *x124) +max (3 *x224, 7* x224)), (5 *max (x124, 7* x124) +5 *max (3 *x224, 7* x224))) == 1816;
eq6 = max ((-min (3* x111, 8* x111) -min (2* x211, 11* x211)), (6* max (3* x114, 8* x114) +6 *max (2* x214, 11* x214)))+max ((max (3* x124, 8* x124) +max (2* x224, 11* x224)), (7 *max (3 *x124, 8* x124) +7* max (2* x224, 11* x224)))+max ((3* max (x114, 7* x114) +3 *max (3 *x214, 7* x214)), (6* max (x114, 7* x114) +6* max (3 *x214, 7* x214)))+max ((-3* min (x121, 7* x121) -3* min (3 *x221, 7* x221)), (4* max (x124, 7* x124) +4* max (3 *x224, 7 *x224))) == 2019;
eq7 = max ((max (-x111, -8* x111) +max (6 *x214, -4 *x211)), (6* max (-x111, -8* x111) +6* max (6 *x214, -4 *x211)))+max ((-3* min (-8* x124, -x124) -3 *min (-4* x224, 6 *x221)), (7 *max (-x121, -8* x121) +7 *max (6 *x224, -4* x221)))+max ((-5* min (-5* x114, -x114) -5 *min (-6 *x214, 2* x211)), (2* max (-x111, -5* x111) +2 *max (2* x214, -6* x211)))+max ((max (-x121, -5 *x121) +max (2* x224, -6 *x221)), (5* max (-x121, -5 *x121) +5 *max (2 *x224, -6* x221))) == 968;
eq8 = max ((-min (-8 *x114, -x114) -min (-4 *x214, 6 *x211)), (6* max (-x111, -8* x111) +6* max (6* x214, -4 *x211)))+max ((max (-x121, -8 *x121) +max (6* x224, -4* x221)), (7 *max (-x121, -8 *x121) +7 *max (6* x224, -4* x221)))+max ((3 *max (-x111, -5 *x111) +3 *max (2* x214, -6 *x211)), (6 *max (-x111, -5* x111) +6* max (2 *x214, -6 *x211)))+max ((-3* min (-5* x124, -x124) -3 *min (-6* x224, 2* x221)), (4* max (-x121, -5 *x121) +4 *max (2 *x224, -6 *x221))) == 843;
sol = fsolve([eq1 eq2 eq3 eq4 eq5 eq6 eq7 eq8], [x111 x114 x121 x124 x211 x214 x221 x224]);
x1Sol = sol.x111;
x2Sol = sol.x114;
x3Sol = sol.x121;
x4Sol = sol.x124;
x5Sol = sol.x211;
x6Sol = sol.x214;
x7Sol = sol.x221;
x8Sol = sol.x224;

6 Comments

Hi, there are multi-solutions:
1:
x111: 30.3831047236785
x211: -5.54126479494526
x121: 9.07407123832865
x221: -7.80391047985726
x124: -15.6019440206575
x224: 13.9240811319989
x114: 8.43062122058869
x214: 1.743186775959
2:
x111: -2.68046897761557
x211: -1.34642477631217
x121: -4.35524991771589
x221: 4.83024881722802
x124: 13.8432911968638
x224: -6.73730121246132
x114: 2.7940467729709
x214: 7.22101075388942
3:
x111: -2.99999999999999
x211: 1.00000000000006
x121: 2.99999999999957
x221: -4.99999999999991
x124: 6.00000000000008
x224: 4.99999999999994
x114: 4.99999999999999
x214: 5.00000000000001
and more...
I can tell from the output that Alex used the program he commonly uses for optimization, which is named 1st Opt. It is a commercial third-party program that is not based on MATLAB. It gets good quality solutions. I am sometimes able to improve a little on the solutions using 1st Opt that he posts, but only with a lot of work.
Hi, Ahmed, as Walter explained, the results provided above have been obtained by a software package named 1stOpt, the code is very simple like below:
Function
min((min(3*x111,8*x111)+min(2*x211,11*x211)),(6*min(3*x111,8*x111)+6*min(2*x211,11*x211)))+min((7*min(3*x121,8*x121)+7*min(2*x221,11*x221)),(-3*max(3*x124,8*x124)-3*max(2*x224,11*x224)))+min((2*min(x111,7*x111)+2*min(3*x211,7*x211)),(-5*max(x114,7*x114)-5*max(3*x214,7*x214)))+min((min(x121,7*x121)+min(3*x221,7*x221)),(5*min(x121,7*x121)+5*min(2*x221,7*x221)))==-964;
min ((6* min (3* x111, 8 *x111)+6* min (2* x211, 11 *x211)),(-max (3*x114, 8* x114) -max (2* x214, 11* x214)))+min ((min (3 *x121, 8* x121)+min (2* x221, 11* x221)),(7* min (3* x121, 8* x121)+7 *min (2 *x221, 11 *x221)))+ min ((3 *min (x111, 7* x111)+3 *min (3* x211, 7* x211)), (6 *min (x111, 7* x111)+6* min (3 *x211, 7* x211)))+min ((4 *min (x121, 7 *x121) +4 *min (3* x221, 7* x221)),(-3 *max (x124, 7 *x124) -3* max (3* x224, 7 *x224)))== -793;
min ((min (-8 *x114, -x114) +min (-4 *x214, 6* x211)), (6 *min (-8* x114, -x114) +6 *min (-4* x214, 6* x211)))+min ((7* min (-8* x124, -x124) +7* min (-4* x224, 6* x221)), (-3* max (-x121, -8* x121) -3* max (6* x224, -4* x221)))+min ((2* min (-5* x114, -x114) +2* min (-6 *x214, 2* x211)), (-5* max (-x111, -5* x111) -5* max (2* x214, -6* x211)))+min ((min (-5* x124, -x124) +min (-6* x224, 2* x221)), (5* min (-5* x124, -x124) +5 *min (-6* x224, 2* x221))) == -1331;
min ((6* min (-8* x114, -x114) +6* min (-4 *x214, 6* x211)), (-max (-x111, -8* x111) -max (6* x214, -4* x211)))+min ((min (-8* x124, -x124) +min (-4 *x224, 6* x221)), (7* min (-8* x124, -x124) +7 *min (-4* x224, 6* x221)))+min ((3* min (-5* x114, -x114) +3* min (-6* x214, 2* x211)), (6* min (-5* x114, -x114) +6* min (-6* x214, 2* x211)))+min ((4* min (-5 *x124, -x124) +4* min (-6* x224, 2* x221)), (-3* max (-x121, -5* x121) -3* max (2* x224, -6* x221))) == -1476;
max ((max (3* x114, 8* x114) +max (2* x214, 11* x214)), (6* max (3* x114, 8* x114) +6 *max (2 *x214, 11 *x214)))+max ((-3 *min (3 *x121, 8* x121) -3* min (2 *x221, 11* x221)), (7 *max (3* x124, 8* x124) +7* max (2* x224, 11* x224)))+max ((-5* min (x111, 7* x111) -5 *min (3* x211, 7* x211)), (2 *max (x114, 7 *x114) + 2* max (3* x214, 7* x214)))+max ((max (x124, 7 *x124) +max (3 *x224, 7* x224)), (5 *max (x124, 7* x124) +5 *max (3 *x224, 7* x224))) == 1816;
max ((-min (3* x111, 8* x111) -min (2* x211, 11* x211)), (6* max (3* x114, 8* x114) +6 *max (2* x214, 11* x214)))+max ((max (3* x124, 8* x124) +max (2* x224, 11* x224)), (7 *max (3 *x124, 8* x124) +7* max (2* x224, 11* x224)))+max ((3* max (x114, 7* x114) +3 *max (3 *x214, 7* x214)), (6* max (x114, 7* x114) +6* max (3 *x214, 7* x214)))+max ((-3* min (x121, 7* x121) -3* min (3 *x221, 7* x221)), (4* max (x124, 7* x124) +4* max (3 *x224, 7 *x224))) == 2019;
max ((max (-x111, -8* x111) +max (6 *x214, -4 *x211)), (6* max (-x111, -8* x111) +6* max (6 *x214, -4 *x211)))+max ((-3* min (-8* x124, -x124) -3 *min (-4* x224, 6 *x221)), (7 *max (-x121, -8* x121) +7 *max (6 *x224, -4* x221)))+max ((-5* min (-5* x114, -x114) -5 *min (-6 *x214, 2* x211)), (2* max (-x111, -5* x111) +2 *max (2* x214, -6* x211)))+max ((max (-x121, -5 *x121) +max (2* x224, -6 *x221)), (5* max (-x121, -5 *x121) +5 *max (2 *x224, -6* x221))) == 968;
max ((-min (-8 *x114, -x114) -min (-4 *x214, 6 *x211)), (6* max (-x111, -8* x111) +6* max (6* x214, -4 *x211)))+max ((max (-x121, -8 *x121) +max (6* x224, -4* x221)), (7 *max (-x121, -8 *x121) +7 *max (6* x224, -4* x221)))+max ((3 *max (-x111, -5 *x111) +3 *max (2* x214, -6 *x211)), (6 *max (-x111, -5* x111) +6* max (2 *x214, -6 *x211)))+max ((-3* min (-5* x124, -x124) -3 *min (-6* x224, 2* x221)), (4* max (-x121, -5 *x121) +4 *max (2 *x224, -6 *x221))) == 843;
running above code in 1stOpt, a number of qualified outcomes could be obtained, some more results:
4:
x111: -3.58695295911305
x211: -1.07445850909051
x121: 2.28498000867595
x221: -2.28614733165542
x124: 7.8754041983795
x224: 2.89049819889564
x114: 4.51941882428882
x214: 5.9927411320934
5:
x111: -17.7235672005484
x211: 11.2510753617849
x121: 108.850694404822
x221: 118.545735063581
x124: 7.37522534014823
x224: -6.20277399969955
x114: 20.7395783564568
x214: -10.1936285553793
the exactised one should be:
x111: -3
x211: 1
x121: 3
x221: -5
x124: 6
x224: 5
x114: 5
x214: 5
Hi, some error or wrong input:
1: "6x112" should be "6*x112";
2: "==-206&&" should be "==-206;";
3: "-3X223,5X222" should be "-3*X223,5*X222";
4: "X*213" should be "X213";
5: "2Min(" should be "2*Min(".
After doing above modifications, the result will be:
x112: -6.7405060869832
x212: 2.36971338564915
x122: 9.82757565025085
x222: 2.73979655042066
x123: 2.66935775949842
x223: 3.48702836315802
x113: 8.53397905414663
x213: -0.859553149820282
One more solution:
x112: -9.12751728247536
x212: -4.85242981963661
x122: 40.4685284423888
x222: 18.2309312718438
x123: -30.3270190436273
x223: 17.4965264223753
x113: 13.8173196565403
x213: -4.695181312283

Sign in to comment.

 Accepted Answer

syms x111 x114 x121 x124 x211 x214 x221 x224
min = @(A,B) piecewise(A<=B, A, B)
max = @(A,B) piecewise(A>=B, A, B)
eq1 = min((min(3*x111,8*x111)+min(2*x211,11*x211)),(6*min(3*x111,8*x111)+6*min(2*x211,11*x211)))+min((7*min(3*x121,8*x121)+7*min(2*x221,11*x221)),(-3*max(3*x124,8*x124)-3*max(2*x224,11*x224)))+min((2*min(x111,7*x111)+2*min(3*x211,7*x211)),(-5*max(x114,7*x114)-5*max(3*x214,7*x214)))+min((min(x121,7*x121)+min(3*x221,7*x221)),(5*min(x121,7*x121)+5*min(2*x221,7*x221)))==-964;
eq2 = min ((6* min (3* x111, 8 *x111)+6* min (2* x211, 11 *x211)),(-max (3*x114, 8* x114) -max (2* x214, 11* x214)))+min ((min (3 *x121, 8* x121)+min (2* x221, 11* x221)),(7* min (3* x121, 8* x121)+7 *min (2 *x221, 11 *x221)))+ min ((3 *min (x111, 7* x111)+3 *min (3* x211, 7* x211)), (6 *min (x111, 7* x111)+6* min (3 *x211, 7* x211)))+min ((4 *min (x121, 7 *x121) +4 *min (3* x221, 7* x221)),(-3 *max (x124, 7 *x124) -3* max (3* x224, 7 *x224)))== -793;
eq3 = min ((min (-8 *x114, -x114) +min (-4 *x214, 6* x211)), (6 *min (-8* x114, -x114) +6 *min (-4* x214, 6* x211)))+min ((7* min (-8* x124, -x124) +7* min (-4* x224, 6* x221)), (-3* max (-x121, -8* x121) -3* max (6* x224, -4* x221)))+min ((2* min (-5* x114, -x114) +2* min (-6 *x214, 2* x211)), (-5* max (-x111, -5* x111) -5* max (2* x214, -6* x211)))+min ((min (-5* x124, -x124) +min (-6* x224, 2* x221)), (5* min (-5* x124, -x124) +5 *min (-6* x224, 2* x221))) == -1331;
eq4 = min ((6* min (-8* x114, -x114) +6* min (-4 *x214, 6* x211)), (-max (-x111, -8* x111) -max (6* x214, -4* x211)))+min ((min (-8* x124, -x124) +min (-4 *x224, 6* x221)), (7* min (-8* x124, -x124) +7 *min (-4* x224, 6* x221)))+min ((3* min (-5* x114, -x114) +3* min (-6* x214, 2* x211)), (6* min (-5* x114, -x114) +6* min (-6* x214, 2* x211)))+min ((4* min (-5 *x124, -x124) +4* min (-6* x224, 2* x221)), (-3* max (-x121, -5* x121) -3* max (2* x224, -6* x221))) == -1476;
eq5 = max ((max (3* x114, 8* x114) +max (2* x214, 11* x214)), (6* max (3* x114, 8* x114) +6 *max (2 *x214, 11 *x214)))+max ((-3 *min (3 *x121, 8* x121) -3* min (2 *x221, 11* x221)), (7 *max (3* x124, 8* x124) +7* max (2* x224, 11* x224)))+max ((-5* min (x111, 7* x111) -5 *min (3* x211, 7* x211)), (2 *max (x114, 7 *x114) + 2* max (3* x214, 7* x214)))+max ((max (x124, 7 *x124) +max (3 *x224, 7* x224)), (5 *max (x124, 7* x124) +5 *max (3 *x224, 7* x224))) == 1816;
eq6 = max ((-min (3* x111, 8* x111) -min (2* x211, 11* x211)), (6* max (3* x114, 8* x114) +6 *max (2* x214, 11* x214)))+max ((max (3* x124, 8* x124) +max (2* x224, 11* x224)), (7 *max (3 *x124, 8* x124) +7* max (2* x224, 11* x224)))+max ((3* max (x114, 7* x114) +3 *max (3 *x214, 7* x214)), (6* max (x114, 7* x114) +6* max (3 *x214, 7* x214)))+max ((-3* min (x121, 7* x121) -3* min (3 *x221, 7* x221)), (4* max (x124, 7* x124) +4* max (3 *x224, 7 *x224))) == 2019;
eq7 = max ((max (-x111, -8* x111) +max (6 *x214, -4 *x211)), (6* max (-x111, -8* x111) +6* max (6 *x214, -4 *x211)))+max ((-3* min (-8* x124, -x124) -3 *min (-4* x224, 6 *x221)), (7 *max (-x121, -8* x121) +7 *max (6 *x224, -4* x221)))+max ((-5* min (-5* x114, -x114) -5 *min (-6 *x214, 2* x211)), (2* max (-x111, -5* x111) +2 *max (2* x214, -6* x211)))+max ((max (-x121, -5 *x121) +max (2* x224, -6 *x221)), (5* max (-x121, -5 *x121) +5 *max (2 *x224, -6* x221))) == 968;
eq8 = max ((-min (-8 *x114, -x114) -min (-4 *x214, 6 *x211)), (6* max (-x111, -8* x111) +6* max (6* x214, -4 *x211)))+max ((max (-x121, -8 *x121) +max (6* x224, -4* x221)), (7 *max (-x121, -8 *x121) +7 *max (6* x224, -4* x221)))+max ((3 *max (-x111, -5 *x111) +3 *max (2* x214, -6 *x211)), (6 *max (-x111, -5* x111) +6* max (2 *x214, -6 *x211)))+max ((-3* min (-5* x124, -x124) -3 *min (-6* x224, 2* x221)), (4* max (-x121, -5 *x121) +4 *max (2 *x224, -6 *x221))) == 843;
eqns = [eq1 eq2 eq3 eq4 eq5 eq6 eq7 eq8]
EQFUN = matlabFunction(eqns, 'vars', {[x111 x114 x121 x124 x211 x214 x221 x224]}, 'file', 'q744767_eqns.m', 'optimize', false)
!cat q744767_eqns.m
sol = fsolve(EQFUN, [x111 x114 x121 x124 x211 x214 x221 x224]);
x1Sol = sol.x111;
x2Sol = sol.x114;
x3Sol = sol.x121;
x4Sol = sol.x124;
x5Sol = sol.x211;
x6Sol = sol.x214;
x7Sol = sol.x221;
x8Sol = sol.x224;
Execution might take a while... A long while. Just to build the function properly :(

2 Comments

Note: when you use piecewise() with matlabFunction then you must send the output to a file, where it will be turned into if/else . matlabFunction() cannot deal with piecewise() in a pure anonymous function.
Interesting, but I can't say that I am astonished.
piecewise() resolves out most (or all) of the branches, so it has a fairly high fan-out.
Your system is not suitable for fsolve(), by the way. fsolve() expects equations with continuous derivatives, but min() and max() do not have continuous derivatives.
Perhaps fminmax would help? Though you might need to rewrite some of the max() in terms of the negative of the min() of the negative of the expressions; https://www.mathworks.com/help/optim/ug/fminimax.html

Sign in to comment.

More Answers (0)

Categories

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!