home *** CD-ROM | disk | FTP | other *** search
- detoha(iter,h,x,y,dy,ddy,iflag,d)
-
- /* subroutine to solve third-order ordinary differential */
- /* equations y''' = f(x,y,y',y'') by Hamming's method. */
-
- int iflag,iter;
- float d[],dy[],ddy[],h,x[],y[];
-
- {
- int i,lda;
- float u2,u3,u4,pmc1,pmc2,pmc3,ppp,pmm,pp,pm,p,pmmm,c,cc,ccc,tm;
- double ytrpri();
-
- d[0] = 0.;
- d[1] = 0.;
- d[2] = 0.;
- d[3] = 0.;
- lda = 4;
- detork(lda,h,x,y,dy,ddy,iflag);
- u2 = ytrpri(x[1],y[1],dy[1],ddy[1],iflag);
- u3 = ytrpri(x[2],y[2],dy[2],ddy[2],iflag);
- u4 = ytrpri(x[3],y[3],dy[3],ddy[3],iflag);
- pmc1 = 0.;
- pmc2 = 0.;
- pmc3 = 0.;
-
- for(i = 3; i <= iter-2; i++)
- {
- ppp = ddy[i-3] + (4./3.) * h * (2.*u4-u3+2.*u2);
- pmm = ppp-(112./121.) * pmc1;
- pp = dy[i-3] + (4./3.) * h * (2.*ddy[i]-ddy[i-1]+2.*ddy[i-2]);
- pm = pp-(112./121.) * pmc2;
- p = y[i-3] + (4./3.) * h * (2.*dy[i]-dy[i-1]+2.*dy[i-2]);
- tm = p-(112./121.) * pmc3;
- pmmm = ytrpri(x[i+1],tm,pm,pmm,iflag);
- ccc = (9.*ddy[i]-ddy[i-2]+3.*h*(pmmm+2.*u4-u3))/8.;
- pmc1 = ppp - ccc;
- ddy[i+1] = ccc + (9./121.) * pmc1;
- cc = (9.*dy[i]-dy[i-2]+3.*h*(ddy[i+1]+2.*ddy[i]-ddy[i-1]))/8.;
- pmc2 = pp - cc;
- dy[i+1] = cc + (9./121.) * pmc2;
- c = (9.*y[i]-y[i-2]+3.*h*(dy[i+1]+2.*dy[i]-dy[i-1]))/8.;
- pmc3 = p - c;
- y[i+1] = c + (9./121.) * pmc3;
- u2 = u3;
- u3 = u4;
- u4 = ytrpri(x[i+1],y[i+1],dy[i+1],ddy[i+1],iflag);
- d[i+1] = c - p;
- }
- }