home *** CD-ROM | disk | FTP | other *** search
- desoha(iter,h,x,y,dy,iflag,d)
-
- /* subroutine to solve second-order ordinary differential */
- /* equations y" = f(x,y,y') by Hamming's method. */
-
- int iflag,iter;
- float d[],dy[],h,x[],y[];
-
- {
- int i,lda;
- float c,cp,p,pm,pmc1,pmc2,pp,ppm,tm,u2,u3,u4;
- double ydopri();
-
- d[0] = 0.;
- d[1] = 0.;
- d[2] = 0.;
- d[3] = 0.;
- lda = 4;
- desork(lda,h,x,y,dy,iflag);
- u2 = ydopri(x[1],y[1],dy[1],iflag);
- u3 = ydopri(x[2],y[2],dy[2],iflag);
- u4 = ydopri(x[3],y[3],dy[3],iflag);
- pmc1 = 0.;
- pmc2 = 0.;
-
- for(i = 3; i <= iter-2; i++)
- {
- pp = dy[i-3] + (4./3.) * h * (2.*u4 - u3 + 2. * u2);
- pm = pp - (112./121.) * pmc1;
- p = y[i-3] + (4./3.) * h * (2. * dy[i] - dy[i-1] + 2. * dy[i-2]);
- tm = p - (112./121.) * pmc2;
- ppm = ydopri(x[i+1],tm,pm,iflag);
- cp = (9. * dy[i] - dy[i-2] + 3. * h * (ppm + 2. * u4 - u3))/8.;
- dy[i+1] = cp + (9./121.) * (pp-cp);
- c = (9. * y[i]-y[i-2]+3.* h *(dy[i+1]+2.*dy[i]-dy[i-1]))/8.;
- y[i+1] = c + (9./121.) * (p - c);
- pmc1 = pp - cp;
- pmc2 = p - c;
- u2 = u3;
- u3 = u4;
- u4 = ydopri(x[i+1],y[i+1],dy[i+1],iflag);
- d[i+1] = c - p;
- }
- }