Hi MaplePrime-ers,

I'm using the following piece of code to (i) solve the system of symbolically, so I can (ii) evaluate equations quickly at many points of time. This works quite well for 4 defined values, but I'm having problems adding a 5th defined value. Specifically, **solve leaves the "solution may be lost" message after taking forever.** As the symbolic solution will be run mulitple times by a optimziation algorithm, I'd ideally like to get the solve time under 2 minutes. I've attached both executed worksheets. Is there anything I can do to have solve work as I intend?

This first code snippet achieves what I would like to do Series_noGear.mw:

#Interconnection Equations

eq2[1] := FD_T + EM2_T = 0;

eq2[2] := ICE_T + GEN_T = 0;

eq2[3] := EM2_A + GEN_A + BAT_A = 0;

eq2[4] := -FD_W + EM2_W = 0;

eq2[5] := -ICE_W + GEN_W = 0;

eq2[6] := -EM2_V + GEN_V = 0;

eq2[7] := -EM2_V + BAT_V = 0;

#ICE

eq_c[1] := ICE_mdot_g= ICE_T * ICE_W;

#BAT

eq_c[2] := BAT_V = 271;

#EM2

EM2_ReqPow_eq := (-148.3) + (4.267)*abs(EM2_W) + (12.77)*abs(EM2_T) + (-0.0364)*abs(EM2_W)^2 + ( 1.16)*abs(EM2_W)*abs(EM2_T) + (-0.258)*abs(EM2_T)^2 + ( 0.0001181)*abs(EM2_W)^3 + (-0.0005994)*abs(EM2_W)^2*abs(EM2_T) + ( 0.0001171)*abs(EM2_W)*abs(EM2_T)^2 + (0.001739 )*abs(EM2_T)^3 + (-1.245e-07 )*abs(EM2_W)^4 + ( 1.2e-06)*abs(EM2_W)^3*abs(EM2_T) + ( -1.584e-06)*abs(EM2_W)^2*abs(EM2_T)^2 + ( 4.383e-07)*abs(EM2_W)*abs(EM2_T)^3 + (-2.947e-06)*abs(EM2_T)^4;

eq_c[3] := EM2_P = piecewise( EM2_T * EM2_W = 0, 0, EM2_W*EM2_T < 0,-1 * EM2_ReqPow_eq, EM2_ReqPow_eq);

eq_c[4] := EM2_A = EM2_P/EM2_V;

#GEN

GEN_ReqPow_eq:= (-5.28e-12) + ( 3.849e-14)*abs(GEN_W) + (-71.9)*abs(GEN_T) + (-1.168e-16)*abs(GEN_W)^2 +(1.296)*abs(GEN_W)*abs(GEN_T) + (2.489)*abs(GEN_T)^2 + (1.451e-19)*abs(GEN_W)^3 + (0.0001326)*abs(GEN_W)^2*abs(GEN_T) + (-0.008141)*abs(GEN_W)*abs(GEN_T)^2 + (-0.004539)*abs(GEN_T)^3 +(-6.325e-23)*abs(GEN_W)^4 + (-2.091e-07)*abs(GEN_W)^3*abs(GEN_T) + ( 3.455e-06)*abs(GEN_W)^2*abs(GEN_T)^2 + ( 2.499e-05)*abs(GEN_W)*abs(GEN_T)^3 + (-5.321e-05)*abs(GEN_T)^4;

eq_c[5] := GEN_P = piecewise(GEN_T * GEN_W = 0, 0, GEN_W*GEN_T < 0,-1 * GEN_ReqPow_eq, GEN_ReqPow_eq);

eq_c[6] := GEN_A = GEN_P/GEN_V;

#assumptions

assume(BAT_V::nonnegative);

assume(FD_W::nonnegative);

termeqs := {eq_c[1],eq_c[2],eq_c[3],eq_c[4],eq_c[5],eq_c[6]};

sys_eqs2 := termeqs union convert(eq2,set);

drivers2:= {ICE_T,ICE_W,FD_T,FD_W};

symvarnames2:=select(type,indets(convert(sys_eqs2,list)),name);

notdrivers2:=symvarnames2 minus drivers2;

sol2:=solve(sys_eqs2,notdrivers2) assuming real;

symb_sol2:=unapply(sol2,[drivers2[]]);

symb_sol2(1,2,3,5);

#Enumerate (there will generally be about 40, not 3)

count := 0;

for i1 from 1 to 3 do

for i2 from 1 to 3 do

for i3 from 1 to 3 do

for i4 from 1 to 3 do

count := count + 1;

solsol2(count) := symb_sol2(i1,i2,i3,i4);

od;

od;

od;

od;

count;

This second code snippet includes the changes **in bold**, which make solve take forever Series_addGear.mw:

#Interconnection Equations

eq2[1] := FD_T + EM2_T = 0;

**eq2[2] := ICE_T + GBb_T = 0;**

eq2[3] := EM2_A + GEN_A + BAT_A = 0;

eq2[4] := -FD_W + EM2_W = 0;

**eq2[5] := -ICE_W + GBb_W = 0;**

eq2[6] := -EM2_V + GEN_V = 0;

eq2[7] := -EM2_V + BAT_V = 0;

**eq2[8] := GBa_T + GEN_T = 0;**

**eq2[9] := -GBa_W + GEN_W = 0;**

#ICE

eq_c[1] := ICE_mdot_g= ICE_T * ICE_W;

#BAT

eq_c[2] := BAT_V = 271;

#EM2

EM2_ReqPow_eq := (-148.3) + (4.267)*abs(EM2_W) + (12.77)*abs(EM2_T) + (-0.0364)*abs(EM2_W)^2 + ( 1.16)*abs(EM2_W)*abs(EM2_T) + (-0.258)*abs(EM2_T)^2 + ( 0.0001181)*abs(EM2_W)^3 + (-0.0005994)*abs(EM2_W)^2*abs(EM2_T) + ( 0.0001171)*abs(EM2_W)*abs(EM2_T)^2 + (0.001739 )*abs(EM2_T)^3 + (-1.245e-07 )*abs(EM2_W)^4 + ( 1.2e-06)*abs(EM2_W)^3*abs(EM2_T) + ( -1.584e-06)*abs(EM2_W)^2*abs(EM2_T)^2 + ( 4.383e-07)*abs(EM2_W)*abs(EM2_T)^3 + (-2.947e-06)*abs(EM2_T)^4;

eq_c[3] := EM2_P = piecewise( EM2_T * EM2_W = 0, 0, EM2_W*EM2_T < 0,-1 * EM2_ReqPow_eq, EM2_ReqPow_eq);

eq_c[4] := EM2_A = EM2_P/EM2_V;

#GEN

GEN_ReqPow_eq:= (-5.28e-12) + ( 3.849e-14)*abs(GEN_W) + (-71.9)*abs(GEN_T) + (-1.168e-16)*abs(GEN_W)^2 +(1.296)*abs(GEN_W)*abs(GEN_T) + (2.489)*abs(GEN_T)^2 + (1.451e-19)*abs(GEN_W)^3 + (0.0001326)*abs(GEN_W)^2*abs(GEN_T) + (-0.008141)*abs(GEN_W)*abs(GEN_T)^2 + (-0.004539)*abs(GEN_T)^3 +(-6.325e-23)*abs(GEN_W)^4 + (-2.091e-07)*abs(GEN_W)^3*abs(GEN_T) + ( 3.455e-06)*abs(GEN_W)^2*abs(GEN_T)^2 + ( 2.499e-05)*abs(GEN_W)*abs(GEN_T)^3 + (-5.321e-05)*abs(GEN_T)^4;

eq_c[5] := GEN_P = piecewise(GEN_T * GEN_W = 0, 0, GEN_W*GEN_T < 0,-1 * GEN_ReqPow_eq, GEN_ReqPow_eq);

eq_c[6] := GEN_A = GEN_P/GEN_V;

**#GB**

**eq_c[7] := GBb_T = -1/GB_R * GBa_T;**

**eq_c[8] := GBb_W = GB_R * GBa_W;**

assume(BAT_V::nonnegative);

assume(FD_W::nonnegative);

**assume(GB_R::nonnegative);**

**termeqs := {**eq_c[1],eq_c[2],eq_c[3],eq_c[4],eq_c[5],eq_c[6]**,eq_c[7],eq_c[8]};**

sys_eqs2 := termeqs union convert(eq2,set);

drivers2:= {**GB_R**,ICE_T,ICE_W,FD_T,FD_W};

symvarnames2:=select(type,indets(convert(sys_eqs2,list)),name);

notdrivers2:=symvarnames2 minus drivers2;

sol2:=solve(sys_eqs2,notdrivers2) assuming real;

symb_sol2:=unapply(sol2,[drivers2[]]);

Does *assume *make solve work faster, or just complicate things? Any help is greatly appreciated!

Series_addGear.mw

Series_noGear.mw