1
1
/* -*- Macsyma -*- */
2
ABEL(DE,A,X):=block([v,coefs,f0,f1,f2,f3,a,%a,%fff,y,u,z,%ff,%dff,
2
abel(de,a,x):=block([v,coefs,f0,f1,f2,f3,a,%a,%fff,y,u,z,%ff,%dff,
6
COEFS:MAKECOEFLIST3(DE),
7
F0:COEFS[1],F1:COEFS[2],F2:COEFS[3],F3:COEFS[4],a:coefs[5],
6
coefs:makecoeflist3(de),
7
f0:coefs[1],f1:coefs[2],f2:coefs[3],f3:coefs[4],a:coefs[5],
8
8
if a#1 then return(abel2(coefs,y,x)),
9
9
if f0=0 and f1=0 and freeof(x,%a:diff(%fff:f3/f2,x)/f2) then
10
10
return(transform(de,y,x,u,z,[x=z,u=%fff*y])),
12
12
%v:exp(integrate((f1+%ff*f2),x)),
13
13
%uu:(f0-%dff+f1*%ff+2*f2*%ff^2/3)/%v^3/f3,
14
14
newde:transform(de,y,x,u,z,[y=u*%v+%ff,z=ratsimp(integrate(f3*%v^2,x))]),
15
RETURN(ratsimp(newDE)))$
18
MAKECOEFLIST3(DE):=BLOCK([a,F0,F1,F2,F3,y,x],
20
A: COEFF(DE,'DIFF(Y,X),1),
26
RETURN([F0,F1,F2,F3,a]))$
28
/*METHOD FOR NON-LINEAR Y'*/
29
NONLIN(DE,Y,X):=BLOCK([temp,temp1,newy,dd,newde,dispflag,%p],
15
return(ratsimp(newde)))$
18
makecoeflist3(de):=block([a,f0,f1,f2,f3,y,x],
20
a: coeff(de,'diff(y,x),1),
26
return([f0,f1,f2,f3,a]))$
28
/*method for non-linear y'*/
29
nonlin(de,y,x):=block([temp,temp1,newy,dd,newde,dispflag,%p],
30
30
de:expand(de),depends(newy,x),dispflag:false,
31
DD:DERIVDEGREE(DE,Y,X),
32
IF(DD>1) THEN RETURN(FALSE) ELSE
33
IF(HIPOW(DE,DIFF(Y,X))<2) THEN RETURN(FALSE),
34
NEWDE:SUBST(%P,DIFF(Y,X),DE),
36
NEWDE:LHS(NEWDE)-RHS(NEWDE),
37
TEMP:SOLVE(NEWDE=0,%P),
38
TEMP:SUBST('DIFF(Y,X),%P,apply('ev,[TEMP])),
39
temp:map(LAMBDA([V],ODE2(V,Y,X)),apply('ev,[TEMP,'diff])),
31
dd:derivdegree(de,y,x),
32
if(dd>1) then return(false) else
33
if(hipow(de,diff(y,x))<2) then return(false),
34
newde:subst(%p,diff(y,x),de),
36
newde:lhs(newde)-rhs(newde),
37
temp:solve(newde=0,%p),
38
temp:subst('diff(y,x),%p,apply('ev,[temp])),
39
temp:map(lambda([v],ode2(v,y,x)),apply('ev,[temp,'diff])),
40
40
temp:map(lambda([v],solve(v,y)),temp),
41
41
return(apply('ev,[temp,'infeval])))$
45
BERNO(DE,Y,X):=BLOCK([nn,mm,nni,mmi,%q,ans],ANS:[],
46
IF(DERIVDEGREE(DE,Y,X)>1) THEN RETURN(FALSE),
48
NN:EXPAND(COEFF(DE,DIFF(Y,X))),
49
MM:EXPAND(RADCAN(DE-NN*DIFF(Y,X))),
50
NNI:APPLY('APPEND,MAPLIST('ELEMENTS,NN)),
51
MMI:APPLY('APPEND,MAPLIST('ELEMENTS,MM)),
52
IF(ATOM(MM) OR PART(MM,0)="^") THEN MM:[MM],
45
berno(de,y,x):=block([nn,mm,nni,mmi,%q,ans],ans:[],
46
if(derivdegree(de,y,x)>1) then return(false),
48
nn:expand(coeff(de,diff(y,x))),
49
mm:expand(radcan(de-nn*diff(y,x))),
50
nni:apply('append,maplist('elements,nn)),
51
mmi:apply('append,maplist('elements,mm)),
52
if(atom(mm) or part(mm,0)="^") then mm:[mm],
53
53
/* commented out of DOE MACSYMA because it can't be translated
54
54
MAP(LAMBDA([V],IF NOT FREEOF(%Q,RATSUBST(%Q,
55
55
DELETE(NUMFACTOR(DIFF(V,X)),DELETE(DIFF(Y,X),DIFF(V,X))),NN))
56
56
THEN ANS:CONS(V,ANS)),MM), */
57
57
/* and replaced by the equivalent do loop */
58
for v in mm do (IF NOT FREEOF(%Q,RATSUBST(%Q,
59
DELETE(NUMFACTOR(DIFF(V,X)),DELETE(DIFF(Y,X),DIFF(V,X))),NN))
60
THEN ANS:CONS(V,ANS)),
58
for v in mm do (if not freeof(%q,ratsubst(%q,
59
delete(numfactor(diff(v,x)),delete(diff(y,x),diff(v,x))),nn))
60
then ans:cons(v,ans)),
63
ELEMENTS(A):=BLOCK([],IF ATOM(A) THEN RETURN([A]),
64
IF(PART(A,0) ="*") THEN RETURN(MAPLPROD(LAMBDA([V],V),A)),
65
IF(PART(A,0)="+") THEN RETURN(MAPLSUM(LAMBDA([V],V),A)),
63
elements(a):=block([],if atom(a) then return([a]),
64
if(part(a,0) ="*") then return(maplprod(lambda([v],v),a)),
65
if(part(a,0)="+") then return(maplsum(lambda([v],v),a)),
68
68
/*Method for nonlinear coeffs*/
69
NONLIN1(de,y,x):=block([%v,a1,a2,newde],
69
nonlin1(de,y,x):=block([%v,a1,a2,newde],
70
70
de:expand(rhs(de)-lhs(de)),depends(%v,x),
71
71
a1:coeff(de,diff(y,x)),
72
72
a2:expand(de-a1*diff(y,x)),