Solve Inequality with inequality constraints
1 view (last 30 days)
Show older comments
Nikolas Spiliopoulos
on 10 Jul 2020
Commented: Walter Roberson
on 10 Jul 2020
Hi there,
i am trying to "solve" an inequality (actually looking for the area of possibel solutions), I have tried this.
syms I I_opt
a=0.1735;
b=0.1967;
c=0.2137;
d=0.2856;
eq_1=I>=0;
eq_2=I_opt>=0;
eq_3=I<=4.67;
eq_4=I_opt<=4.67;
eq_5=a/c*exp(b*I-d*I_opt)*(1-a*exp(b*I))/(1-c*exp(d*I_opt))>1;
eqns=[eq_1 eq_2 eq_3 eq_4 eq_5];
S=solve(eqns,[I I_opt])
Which is actually inequality 5, with 0<=I,I_opt<=4,67;
I get a struct with zero size, although it seems there are solutions for the equations, do you know why?
thanks!!
3 Comments
Walter Roberson
on 10 Jul 2020
Two disconnected triangles. They both fit inside I = 0 to 4.67, I_opt = 0 to 4.67 (
Accepted Answer
Walter Roberson
on 10 Jul 2020
There is no symbolic solution; the equations are too complicated for that.
syms I I_opt real
Q = @(v) sym(v);
a = Q(0.1735);
b = Q(0.1967);
c = Q(0.2137);
d = Q(0.2856);
eq_1 = I >= Q(0);
eq_2 = I_opt >= Q(0);
eq_3 = I <= Q(4.67);
eq_4 = I_opt <= Q(4.67);
eq_5 = a/c*exp(b*I-d*I_opt)*(1-a*exp(b*I))/(1-c*exp(d*I_opt)) > Q(1);
eqns = [eq_1, eq_2, eq_3, eq_4, eq_5];
S = solve(eqns,[I I_opt], 'returnconditions', true);
disp(S)
[Ig, IoG] = ndgrid(linspace(0,4.7,200));
EQ1 = double(subs(eq_1,{I,I_opt},{Ig, IoG}));
EQ2 = double(subs(eq_2,{I,I_opt},{Ig, IoG}));
EQ3 = double(subs(eq_3,{I,I_opt},{Ig, IoG}));
EQ4 = double(subs(eq_4,{I,I_opt},{Ig, IoG}));
EQ5 = double(subs(eq_5,{I,I_opt},{Ig, IoG}));
mask = EQ1 & EQ2 & EQ3 & EQ4 & EQ5;
surf(Ig, IoG, 0+mask, 'edgecolor','none')
5 Comments
Walter Roberson
on 10 Jul 2020
btw, is there any way to see the actual values on z axis instead of just 0 and 1?
Only if by "actual values" you mean something like the total of the masks, like
mask = EQ1 + EQ2 + EQ3 + EQ4 + EQ5;
Remember, you do not define a surface, you define a number of inequalities, and each of them is only either true or false.
Walter Roberson
on 10 Jul 2020
syms I I_opt real
Q = @(v) sym(v);
a = Q(0.1735);
b = Q(0.1967);
c = Q(0.2137);
d = Q(0.2856);
eq_1 = I >= Q(0);
eq_2 = I_opt >= Q(0);
eq_3 = I <= Q(4.67);
eq_4 = I_opt <= Q(4.67);
eq_5_L = a/c*exp(b*I-d*I_opt)*(1-a*exp(b*I))/(1-c*exp(d*I_opt));
eq_5 = eq_5_L > Q(1);
%eqns = [eq_1, eq_2, eq_3, eq_4, eq_5];
%S = solve(eqns,[I I_opt], 'returnconditions', true);
%disp(S)
[Ig, IoG] = ndgrid(linspace(0,4.7,200));
EQ1 = double(subs(eq_1,{I,I_opt},{Ig, IoG}));
EQ2 = double(subs(eq_2,{I,I_opt},{Ig, IoG}));
EQ3 = double(subs(eq_3,{I,I_opt},{Ig, IoG}));
EQ4 = double(subs(eq_4,{I,I_opt},{Ig, IoG}));
EQ5_L = double(subs(eq_5_L,{I,I_opt},{Ig, IoG}));
EQ5 = EQ5_L > 1;
mask = EQ1 & EQ2 & EQ3 & EQ4 & EQ5;
z = nan(size(EQ5_L));
z(mask) = EQ5_L(mask);
surf(Ig, IoG, z, 'edgecolor','none')
More Answers (0)
See Also
Categories
Find more on Symbolic Math Toolbox in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!