# $Source: /u/maple/research/lib/DEtools/src/RCS/formal_sol,v $ # $Notify: mvanhoei@daisy.uwaterloo.ca $ # The purpose of this file is to do the type checking and conversions # for `DEtools/diffop/formal_sol` macro( x=`DEtools/diffop/x`, DF=`DEtools/diffop/DF`, index_them=`DEtools/index_them`, formal_sol=`DEtools/diffop/formal_sol`, l_p=`DEtools/diffop/l_p`, g_ext=`DEtools/diffop/g_ext`, nt=`DEtools/diffop/nt` ): # Both for operator and equation syntax. # args[4..nargs] are options of the form x=point and such. `DEtools/formal_sol`:=proc(L,d,T) global index,x,DF,order,groundfield; local a,p,o,g,i,j; option `Copyright (c) 1997 Waterloo Maple Inc. All rights reserved.\ Author: M. van Hoeij`; a:=[args]; if indets(a,{radical,nonreal})<>{} then g := radfield(indets(a,{radical,nonreal})); return eval(subs(g[2],procname(op(eval(subs(g[1],a)))))) elif type(d,function) then return procname(`DEtools/de2diffop`(L,d,[DF,op(d)]), [DF,op(d)],args[3..-1]) elif nargs=1 or not(type(d,list)) then if nargs>1 and d=_Envdiffopdomain then error "differential algebra not specified" else return procname(L,_Envdiffopdomain,args[2..-1]) fi elif not has(L,d[1]) then error "order should be greater than zero" elif nargs<3 or not type(T,'name') then return procname(L,d,index,args[3..-1]) fi; _Envdiffopdomain:=d; # for the userinfo's in diffop. a:=[args[4..-1]]; p:=0; hasoption(a,d[2],'p','a'); # point is given by x=point o:=Order; hasoption(a,'terms','o','a'); g:=NULL; hasoption(a,'groundfield','g','a'); if a<>[] then error "wrong arguments" fi; a:=formal_sol(l_p(subs(d[1]=DF,d[2]=x,L),p),g_ext([L,g,p])); if T=`has logarithm?` then return evalb( has(indets(a,'function'),ln) ) fi; a:=subs(x=T,[seq([nt(i[1],o),i[2],`if`(nops(i)>3,i[4],x)],i=a)]); a:=[seq([seq(T^coeff(j[2],T,0)* exp(int((j[2]-coeff(j[2],T,0))/T,T))* series(i+T^o,T=0,o) ,i=j[1]),j[3]=`if`(p=infinity,1/d[2],d[2]-p)],j=a)]; if T=index then a:=[seq(op(subs(T=RootOf(j[-1],T),j[1..-2])),j=a)]; [seq(index_them(j,[args]),j=subs(`algcurves/g_conversion2`, convert([seq(index_them(j,[args]),j=a)], radical)))] else subs(`algcurves/g_conversion2`,a) fi end: # Replace the RootOf's that don't occur in A by indexed RootOf's. index_them:=proc(i,A) local j,v; v:=indets(i,'RootOf') minus indets(A,'RootOf'); v:=remove(has,v,index); if v={} then return i fi; v:=v minus indets(map(op,v),RootOf); v:=v[1]; seq(procname(subs(v=RootOf(op(v),index=j),i),A), j=1..frontend(degree,[op(1,v),_Z])) end: #savelib('`DEtools/formal_sol`', '`DEtools/index_them`'):