File: pmain.mac

package info (click to toggle)
maxima 5.27.0-3
  • links: PTS
  • area: main
  • in suites: wheezy
  • size: 120,648 kB
  • sloc: lisp: 322,503; fortran: 14,666; perl: 14,343; tcl: 11,031; sh: 4,146; makefile: 2,047; ansic: 471; awk: 24; sed: 10
file content (159 lines) | stat: -rw-r--r-- 7,071 bytes parent folder | download | duplicates (16)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
/* ************** beginning of main ******************************** */

lode2(oeq):=block([lhs,ay,ypx],tobegin(dum),
   remvalue(y1,y2), swro:0, ys:f, nhstddeq(oeq), if rr#0 then 
    (print("first",str1,eq)), kt:0, ys:hlode2(eq), 
   if rr=0 then return(ys), print("the solution of the homog. eq. is",ys),
   ldf0(8), ypx:nonhom(rr,y1,y2), return(ys+ypx))$

tobegin(dum):=block([],dyx2:'diff(y,x,2),dyx1:'diff(y,x),
   dyt2:'diff(y,t,2),dyt1:'diff(y,t),dux2:'diff(u,x,2),dux1:'diff(u,x),
   str1:"we solve",str2:"we use",str3:"the result is",str4:"type y or n",
   str5:"positive,zero,or negative? type p,z,or n")$

nhstddeq(oeq):=block([], weq:expand(oeq), lhs:part(weq,1), 
   rhs:part(weq,2), lhs:lhs-rhs, deqcoeff(lhs), wlhs:lhs, 
   lhs:za*dyx2+zb*dyx1+zc*y, rhs:-ratsimp(wlhs-lhs), 
   weq:lhs=rhs, steq:stddeq(weq), lhs:part(steq,1), eq:lhs=0,
   if lhs#wlhs then print(str1,steq))$

hlode2(eq):=block([exp,ro], aeq[kt]:eq, swsv:f, 
 ll1, leq:part(eq,1), tp:brchde1(leq),
   if zc=0   then (ldf0( 9),svode1(rb),return(ys)),
   if tp= 50 then (ldf0(10),skelp(rb,rc), if ys#f then return(ys)),
   if swpt=y then (ldf0(11),gptm(rb,rc),  if ys#f then return(ys) 
      else if rptm=t then (if freeof(y,vtr) then idvprep(1) 
                           else idvprep(2),go(ll1))),
   if tp>60  then (lv:listofvars(za), if length(lv)>1 then 
      (ldf0(16), if stddsp(za)=t then go(ll2)), tblspt(za,rb,rc,x,n), 
      if nspt>3  then (ldf0(12),if grmaps(dum)=y then go(ll1))),
   ha:hipow(za*q1+zb*q2+zc*q3,x), netv:listofvars(ha),lg:length(netv),
      if lg>0 then (ldf0(13),if ppowr(rb,rc,lg) then tp:70),
   if tp<=70 then go(ll2), vecdeg(za,zb,zc,x), tp:brchde2(rb,rc), 
   if tp=110 then (ldf0(2),svconf(rb,rc),return(ys)) else 
   if tp=120 then (ldf0(3),svhypr(rb,rc),return(ys)) else
   if tp=125 then (idvprep(2),go(ll1)),
   if tp=126 then (idvprep(1),go(ll1)),
   if tp=130 then return(ys),   if swsv=tdv or tp=990 then go(ll3),
  ll2,ldf0(5),neq:ivtrns(rb,rc,rr),if 10<tp and tp<14 then go(ll3),
   if neq#f  then (idvprep(1),go(ll1)),   if tp=0 then go(ll4),
  ll3, ldf0(6),neq:dvtrns(za,rb,rc,rr,ro,lam1),
   if neq#f  then (idvprep(2),go(ll1)),
  ll4, nosol(oeq),return(oeq))$

deqcoeff(exp):=block([],za:coeff(exp,dyx2,1),zb:coeff(exp,dyx1,1),
   zc:coeff(exp,y,1),rb:ratsimp(zb/za),rc:ratsimp(zc/za))$

brchde1(exp):=block([],
   if not freeof(sin,cos,tan,cot,exp)     then return(10),
   if not freeof(%e,exp)                  then return(20),
   if not freeof(log,exp)                 then return(30),
   if not freeof(sinh,cosh,tanh,coth,exp) then return(40),
   if not freeof(sn,cn,dn,pe,th,exp)      then return(50),
   if not freeof(sqrt(x),exp)             then return(60),
   return(990))$

brchde2(wb,wc):=block([ws,wi], 
   if nspt=1 then (if rk[1]=1 then return(110)),
   if nspt=2 then (if rk[1]<=0 and denom(rk[2])<3 and rk[2]<=1 then 
     (if spt[1]#0 then (axb:x-spt[1],return(91)) else return(110))),
   if nspt=3 and rk[1]=0 and rk[2]=0 then (if rk[3]=0 then
     (if nf=1 and maxacf=2 then (ldf0(14),if powr(wb,wc,2) then return(80)),
      if da=2 and db=1 and dc=0 then 
         (ldf0(15),tp:eqpt1(dum), if tp#f then return(tp)),
      if da=3 and db=2 and dc=1 then
         (ldf0(18),tp:eqpt12(wb,wc),if tp#f then return(tp))),
    if da=4 and db=3 and dc<=4 then
         (ldf0(17),tp:eqpt11(dum),if tp#f then return(tp)) else
    if rk[3]=0 then return(120)),
   ldf0(7),tp:brchde3(wb,wc),return(tp))$

tblspt(za,wb,wc,x,ksw):=block([k,n,wa,wf,wfi], k:0, n:hipow(za,x), 
   if n=0 then go(lf), pspt:1, maxacf:0, wf:facza(za), j:0,
   for i:1 thru nf do (pwf[i]:part(wf,i),if pwf[i]=x then j:i),
   if nf>1 and j>1 then (ws:pwf[1],pwf[1]:pwf[j],pwf[j]:ws),
   for i:1 thru nf do (wfi:solve(pwf[i],x),l1:length(wfi),
     lacf[i]:l1, l2:polord(za,pwf[i]), maxacf:max(maxacf,l2),
     for j:1 thru l1 do (k:k+1,spt[k]:part(wfi[j],2),
      if ksw#n then kindspt(wb,wc,k),
      if l1=1 then pspt:pspt*spt[k] else pspt:0)),
 lf,k:k+1,nspt:k,spt[k]:inf,if ksw#n then (kindspt(wb,wc,k),ro:rk[k]))$

facza(za):=block([w1,w2,w3,w4], w1:za,w2:diff(w1,x),w3:gcd(w1,w2), 
   w4:ratsimp(w1/w3), wf:factor(w4), if wf=w4 then nf:1 else nf:length(wf), 
   if nf=1 then wf:[wf], return(wf))$

vecdeg(za,zb,zc,x):=block([],da:hipow(za,x),db:hipow(zb,x),dc:hipow(zc,x))$

nosol(oeq):=block([], print("we cannot solve"), print(oeq))$

idvprep(i):=block([],print(str2,vtr),print(str3,neq), 
   if i=1 then eq:subst(x,t,neq) else eq:subst(y,u,neq), vprep(dum))$

vprep(dum):=block([],eq:stddeq(eq),print(str1,eq),kt:kt+1,aeq[kt]:eq,
   avtr[kt]:vtr)$

stddeq(oeq):=block([wexp,wr,deq],wexp:part(oeq,1),
   wr:part(oeq,2),deqcoeff(wexp),rr:ratsimp(wr/za), 
   za:calca(rb,rc,x), zb:ratsimp(rb*za), zc:ratsimp(rc*za), 
   deq:dyx2+rb*dyx1+rc*y=rr, return(deq))$

calca(wb,wc,x):=block([],w1:denom(wb),w2:denom(wc),za:lcm(w1,w2,x))$

lcm(p,q,x):=block([r,s],r:gcd(p,q,x),s:ratsimp(p*q/r),return(s))$

polord(exp,sexp):=block([we,n],we:exp,n:0,ll,we:ratsimp(we/sexp), 
   if denom(we)#1 then return(n), n:n+1,go(ll))$

kindspt(wb,wc,k):=block([bt,ct,b1,c1,dbt,dct],
   if spt[k]=inf then alpha:0 else alpha:spt[k],
   bt:ratsubst(1/t+alpha,x,wb), b1:ratsimp((2*t-bt)/t^2), 
   ct:ratsubst(1/t+alpha,x,wc), c1:ratsimp(ct/t^4),if spt[k]=inf then 
    (bt:subst(x,t,b1),ct:subst(x,t,c1),dbt:ratdeg(wb,x),dct:ratdeg(wc,x))
 else (bt:ratsimp(wb),ct:ratsimp(wc),  dbt:ratdeg(b1,t),dct:ratdeg(c1,t)),
   rk[k]:max(dbt,dct/2)+1, if rk[k]=0 and freeof(%i,alpha) 
   then regsingpt(x-alpha,bt,ct,alpha))$

ratdeg(rf,x):=block([wrf,nrf,dgnrf,drf,dgdrf,dgrf],if rf=0 then 
   return(-99), wrf:ratsimp(rf), nrf:num(wrf), dgnrf:hipow(nrf,x),
   drf:denom(wrf),dgdrf:hipow(drf,x), dgrf:ratsimp(dgnrf-dgdrf),
   return(dgrf))$

regsingpt(xa,wb,wc,alpha):=block([f1,g1,flx], remvalue(l),
   f1:ratsimp(xa*wb), g1:ratsimp(xa^2*wc), flx:l^2+(f1-1)*l+g1,
   cheq[k]:subst(alpha,x,flx),cflx[k]:flx)$

reqans1(dum):=block([],ans:read("continue?",str4))$

ldf0(i):=block([],if ldsw[0,i]#y then (ldsw[0,i]:y,
   if i= 2 then load(pconfl) else
   if i= 3 then load(phypgm) else
   if i= 5 then load(pivtr) else
   if i= 6 then load(pdvtr) else
   if i= 7 then load(pbrnch) else
   if i= 8 then load(pnonh) else
   if i= 9 then load(psode1) else
   if i=10 then load(pskelp) else
   if i=11 then load(pgptm) else
   if i=12 then load(premap) else
   if i=13 then load(ppow) else
   if i=14 then load(pnpow) else
   if i=15 then load(peqp1) else
   if i=16 then load(pstdsp) else
   if i=17 then load(peqp11) else
   if i=18 then load(peqp12) ))$

lodesave(filename,[lode_functions]):=
  if status(feature,its)=true
  then apply('fassave,cons(filename,lode_functions))
  else block([packagefile:true],
	     if status(feature,unix)=true
	     then apply('save,
			cons(concat(first(filename),".l"),lode_functions))
	     else error("unknown system"))$

lodesave([pmain,fasl],lode2,tobegin,nhstddeq,hlode2,brchde1,vecdeg,
   brchde2,deqcoeff,tblspt,facza,nosol,idvprep,vprep,stddeq,calca,
   lcm,polord,kindspt,ratdeg,regsingpt,reqans1,ldf0);

lodesave([lodsav,fasl],lodesave)$