6.76 asympt() with multiple variables? (16.2.01)

6.76.1 Daniel Krofchick
6.76.2 Chris Eilbeck (19.2.01)
6.76.3 Boris Alexeev (20.2.01)
6.76.4 Helmut Kahovec (21.2.01)

6.76.1 Daniel Krofchick

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.

6.76.2 Chris Eilbeck (19.2.01)

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!

6.76.3 Boris Alexeev (20.2.01)

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);
 

6.76.4 Helmut Kahovec (21.2.01)

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