subroutine difequ ( mode, xx, v )
c from * a practical guide to splines * by c. de boor
calls ppvalu(interv)
c to be called by c o l l o c , p u t i t
c information about the differential equation is dispensed from here
c
c****** i n p u t ******
c mode an integer indicating the task to be performed.
c = 1 initialization
c = 2 evaluate de at xx
c = 3 specify the next side condition
c = 4 analyze the approximation
c xx a point at which information is wanted
c
c****** o u t p u t ******
c v depends on the mode . see comments below
c
integer mode, i,iside,itermx,k,kmax,kpm,l,m,ncoef,npiece
parameter (npiece=100, kmax=20, ncoef=npiece*kmax)
real v(kmax),xx, break,coef,eps,ep1,ep2,error,factor,rho,solutn
* ,s2ovep,un,x,xside
common /approx/ break(npiece),coef(ncoef),l,kpm
C common /approx/ break(100),coef(2000),l,kpm
common /side/ m,iside,xside(10)
common /other/ itermx,k,rho(kmax-1)
save eps,factor,s2ovep
c
c this sample of difequ is for the example in chapter xv. it is a
c nonlinear second order two point boundary value problem.
c
go to (10,20,30,40),mode
c initialize everything
c i.e. set the order m of the dif.equ., the nondecreasing sequence
c xside(i),i=1,...,m, of points at which side cond.s are given and
c anything else necessary.
10 m = 2
xside(1) = 0.
xside(2) = 1.
c *** print out heading
print 499
499 format(' carrier,s nonlinear perturb. problem')
eps = .5e-2
print 610, eps
610 format(' eps ',e20.10)
c *** set constants used in formula for solution below.
factor = (sqrt(2.) + sqrt(3.))**2
s2ovep = sqrt(2./eps)
c *** initial guess for newton iteration. un(x) = x*x - 1.
l = 1
break(1) = 0.
do 16 i=1,kpm
16 coef(i) = 0.
coef(1) = -1.
coef(3) = 2.
itermx = 10
return
c
c provide value of left side coeff.s and right side at xx .
c specifically, at xx the dif.equ. reads
c v(m+1)d**m + v(m)d**(m-1) + ... + v(1)d**0 = v(m+2)
c in terms of the quantities v(i),i=1,...,m+2, to be computed here.
20 continue
v(3) = eps
v(2) = 0.
un = ppvalu(break,coef,l,kpm,xx,0)
v(1) = 2.*un
v(4) = un**2 + 1.
return
c
c provide the m side conditions. these conditions are of the form
c v(m+1)d**m + v(m)d**(m-1) + ... + v(1)d**0 = v(m+2)
c in terms of the quantities v(i),i=1,...,m+2, to be specified here.
c note that v(m+1) = 0 for customary side conditions.
30 v(m+1) = 0.
go to (31,32,39),iside
31 v(2) = 1.
v(1) = 0.
v(4) = 0.
go to 38
32 v(2) = 0.
v(1) = 1.
v(4) = 0.
38 iside = iside + 1
39 return
c
c calculate the error near the boundary layer at 1.
40 continue
print 640
640 format(' x, g(x) and g(x)-f(x) at selected points')
x = .75
do 41 i=1,9
ep1 = exp(s2ovep*(1.-x))*factor
ep2 = exp(s2ovep*(1.+x))*factor
solutn = 12./(1.+ep1)**2*ep1 + 12./(1.+ep2)**2*ep2 - 1.
error = solutn - ppvalu(break,coef,l,kpm,x,0)
print 641,x,solutn,error
641 format(3e20.10)
41 x = x + .03125
return
end