(* File: count-zeros by Hongyou Wu on 2006/08/27 *) (* *) (* Input: aaZZ, bbZZ, efZZ[t_] *) (* *) (* Optional input: inpZZ *) (* *) (* Output: npointsZZ, nzerosZZ *) Clear[iZZ,jZZ,npointsZZ,stepZZ,valueZZ,oonZZ,onZZ,nzerosZZ,osZZ,signZZ,ovalueZZ]; (* inp: initial number of points oon: old old number *) (* on: old number nzeros: number of zeros inside interval *) (* os: old sign *) If[ValueQ[inpZZ]==False || inpZZ<8, inpZZ=8]; npointsZZ=inpZZ; stepZZ=(bbZZ-aaZZ)/npointsZZ; Do[valueZZ[jZZ]=efZZ[aaZZ+(jZZ-1)*stepZZ]//N, {jZZ,1,npointsZZ}]; oonZZ=-2; onZZ=-1; nzerosZZ=0; osZZ=Sign[ valueZZ[1] ]; Do[{signZZ=Sign[ valueZZ[jZZ] ]; If[(osZZ!=0 && signZZ==0) || osZZ*signZZ<0, nzerosZZ=nzerosZZ+1]; osZZ=signZZ; }, {jZZ,2,npointsZZ} ]; (* ov: old value *) iZZ=2; While[iZZ<100 && (oonZZ!=nzerosZZ || onZZ!=nzerosZZ), Do[ovZZ[jZZ]=valueZZ[jZZ], {jZZ,1,npointsZZ}]; stepZZ=stepZZ/2; Do[{valueZZ[2*jZZ-1]=ovZZ[jZZ]; valueZZ[2*jZZ]=efZZ[aaZZ+(2*jZZ-1)*stepZZ]//N;}, {jZZ,1,npointsZZ} ]; npointsZZ=2*npointsZZ; oonZZ=onZZ; onZZ=nzerosZZ; nzerosZZ=0; osZZ=Sign[ valueZZ[1] ]; Do[{signZZ=Sign[ valueZZ[jZZ] ]; If[(osZZ!=0 && signZZ==0) || osZZ*signZZ<0, nzerosZZ=nzerosZZ+1]; osZZ=signZZ; }, {jZZ,2,npointsZZ} ]; iZZ=iZZ+1; ]; If[oonZZ!=nzerosZZ || onZZ!=nzerosZZ, Print["Failed to count zeros!"]]; Clear[aaZZ,bbZZ,efZZ,inpZZ,iZZ,jZZ,stepZZ,valueZZ,oonZZ,onZZ,osZZ,signZZ,ovZZ];