I am trying to simplify several long expressions using the assumption that some constants in the expression are much larger than others. The expressions are obtained by solving a cubic. Here is the code
lambda:=[solve(l^3+A*l^2+B*l+C,l)]: A:=K32+K34+K43+K21+K23+K12: B:=K21*K43+K23*K34+K12*K43+K12*K34+K12*K32+K21*K34+K32*K43+K23*K43+K12*K23+K21*K32: C:=K43*K21*K32+K12*K23*K34+K12*K32*K43+K12*K23*K43:
where all \(Kij>0\) and presumably Real (since they represent rate constants). The assumption I want
to use to simplify the expression is K12,K21,K34,K43>>K23,K32
).
Is there any way to do this in Maple 6? I have been playing with asympt which works well when I want to make this kind of assumption for one variable (in a simpler system derived from a cubic), but the function isn’t defined for multiple variables.
One way would be to write K23= t*k23, K32 = t*k32
, and expand in a Taylor series in t.
But the answer is still very messy in this case, even with t=0!
1st answer:
restart; f:=exp(1/x+1/y): n:=2: m:=3: asympt(f,x,n): remove(has,%,O): asympt(%,y,m): remove(has,%,O);
Towards solution:
Is this from chemical kinetics? YES!
chemical reaction
x1=x2 x2=x3 x3=x4
differential equations
x1' = -k12*x1+k21*x2 x2' = k12*x1-k21*x2-k23*x2+k32*x3 x3' = k23*x2-k32*x3-k34*x3+k43*x4 x4' = k34*x3-k43*x4
Jacobi matrix
array([[l+K12,-K21,0,0],[-K12,l+K21+K23,-K32,0],[0,-K23,l+K32+K34,-K43], [0,0,-K34,l+K43]]);
2nd answer:
restart;
get Jacobi matrix
array([[l+K12,-K21,0,0],[-K12,l+K21+K23,-K32,0],[0,-K23,l+K32+K34,-K43], [0,0,-K34,l+K43]]); ll:=simplify(linalg[det](%)/l):
switch asymptotics on
s:={K12=x*k12, K21=x*k21, K34=x*k34, K43=x*k43};
switch asymptotics off
si:={k12=K12,k21=K21,k34=K34,k43=K43,x=1}; sll:=subs(s,ll/x^2);
get crude solution (one eigenvalue)
asympt(sll,x,1): remove(has,%,O); collect(subs(si,%),l,factor); `crude eigenvalue=`,solve(%,l);
get next (and last) approximation (two values)
asympt(sll,x,2): remove(has,%,O); collect(subs(si,%),l,factor); `eigenvalue revisited (even twins)=`,solve(%,l);
Instead of K12,K21,K34,K43 >> K23,K32
I’d like to prefer K23,K32 << K12,K21,K34,K43
.
Then we may use mtaylor() as shown in the Maple6 session below.
> restart; > A:=K32+K34+K43+K21+K23+K12: > B:=K21*K43+K23*K34+K12*K43+K12*K34+K12*K32+ > K21*K34+K32*K43+K23*K43+K12*K23+K21*K32: > C:=K43*K21*K32+K12*K23*K34+K12*K32*K43+K12*K23*K43: > equ:=l^3+A*l^2+B*l+C: > lambda:=[solve(equ,l)]: nops(lambda); 3 > mtaylor(lambda[1],[K23,K32],2,[1,1]): > map(factor,%): > subs( > {signum(K43-K21+K34-K12)=1,signum(-K43+K21-K34+K12)=-1}, > map(simplify,%,assume=positive) > ): > map(factor,%): > subs( > {signum(K43-K21+K34-K12)=1,signum(-K43+K21-K34+K12)=-1}, > map(simplify,%,assume=positive) > ): > map(factor,%): > subs( > {signum(K43-K21+K34-K12)=1,signum(-K43+K21-K34+K12)=-1}, > map(simplify,%,assume=positive) > ): > map(factor,%):
Unfortunately, I could not find another way to force Maple to choose the appropriate branch cut:
> subs(J=I,map(simplify,subs(I=J,%),symbolic)): > lambda1:=map(factor,%); K32 K34 lambda1 := -K34 - K43 - --------- K34 + K43 > mtaylor(lambda[2],[K23,K32],2,[1,1]): > map(factor,%): > subs( > {signum(K43-K21+K34-K12)=1,signum(-K43+K21-K34+K12)=-1}, > map(simplify,%,assume=positive) > ): > map(factor,%): > subs( > {signum(K43-K21+K34-K12)=1,signum(-K43+K21-K34+K12)=-1}, > map(simplify,%,assume=positive) > ): > map(factor,%): > subs( > {signum(K43-K21+K34-K12)=1,signum(-K43+K21-K34+K12)=-1}, > map(simplify,%,assume=positive) > ): > map(factor,%): > subs(J=I,map(simplify,subs(I=J,%),symbolic)): > lambda2:=map(factor,%); K21 K23 lambda2 := -K12 - K21 - --------- K21 + K12 > mtaylor(lambda[3],[K23,K32],2,[1,1]): > map(factor,%): > subs( > {signum(K43-K21+K34-K12)=1,signum(-K43+K21-K34+K12)=-1}, > map(simplify,%,assume=positive) > ): > map(factor,%): > subs( > {signum(K43-K21+K34-K12)=1,signum(-K43+K21-K34+K12)=-1}, > map(simplify,%,assume=positive) > ): > map(factor,%): > subs( > {signum(K43-K21+K34-K12)=1,signum(-K43+K21-K34+K12)=-1}, > map(simplify,%,assume=positive) > ): > map(factor,%): > subs(J=I,map(simplify,subs(I=J,%),symbolic)): > lambda3:=map(factor,%); K23 K12 K32 K43 lambda3 := - --------- - --------- K21 + K12 K34 + K43
Finally, let us check the solutions:
> testeq( > A=simplify(-(lambda1+lambda2+lambda3)) > ); true > testeq( > B=factor( > mtaylor( > expand( > lambda1*lambda2+lambda1*lambda3+lambda2*lambda3 > ), > [K23,K32],2,[1,1] > ) > ) > ); true > testeq( > C=factor( > mtaylor( > expand(-lambda1*lambda2*lambda3), > [K23,K32],2,[1,1] > ) > ) > ); true