infinitesimal limit wizard



Stavros Macrakis <macrakis <at> alum.mit.edu> writes:
  Can you show that your result is
> correct?
> 
>               -s
> This is the source code, I think is simple enough to understand, it can be
improved easily.  But is not tested, I have done it this morning, perhaps I can
document the code.

 

h(x):= block([re],re:g(x), if re=false then x else re);



lst1:[sin,asin,sinh,tan,atan,tanh];
lst2:[cos,cot];


inflag:true;
var:x;
x0:0;




g(x):=block([o,a,re],
	if atom(x) then return(x),
	o: op(x),u:args(x)[1],	
	if o ="^"  then 
		(re:g(u), if re = false then return(x) else return (re^args(x)[2])),
	if op(x)="*"  then return(map(h,x)),
	if member(o,lst1) then return(try(u)),
	if member(o,lst2) then return(try(%pi/2 - u)),	
	if o='log then return(try(u-1)) else return(x));


	
try(a):= block([ga],ga:g(a),
	if ga # a then return (g(ga)),
	if limit(a,var,x0)=0 then pr(a) else false);




pr(f):= block([re],re: first(ratdisrep(taylor(f,var,x0,20))),
			if (re # 0) then re else f);