home *** CD-ROM | disk | FTP | other *** search
- # Routines for finding and evaluating Chebychev polynomials
- # with example of usage
- #
- # nb: routines assume array base is 1
- # nb: chebyfit takes a while...
-
- NMAX = 40
- array ch_fnvals[1] # array of function values for chebyfit (will be resized)
-
- func chebyfit(a,b,@c,n,~f) = {
- local bma, bpa, y, j, k, fac, sum
-
- resize(ch_fnvals, n)
- bma = 0.5*(b-a)
- bpa = 0.5*(b+a)
-
- for (k = 1; k <= n; k += 1)
- {
- y = cos(PI*(k-0.5)/n)
- x = y*bma+bpa # set up x
- ch_fnvals[k] = f # for function evaluation
- }
-
- fac = 2/n
- for (j = 1; j <= n; j += 1)
- {
- sum = 0
- for (k = 1; k <= n; k += 1)
- sum += ch_fnvals[k]*cos((PI*(j-1))*((k-0.5)/n))
- c[j] = fac*sum
- }
- }
-
-
- func chebyeval(a,b,@c,m,x) = { # m is how many coeffs to use
- local j, d, dd, y, y2, sv # ...can (and should) be < NMAX
-
- if ((x-a)*(x-b) > 0) error(1)
- d = 0
- dd = 0
- y = (2*x-a-b)/(b-a)
- y2 = 2*y
-
- for (j = m; j >= 2; j -= 1)
- {
- sv = d
- d = y2*d-dd+c[j]
- dd = sv
- }
-
- return(y*d-dd+0.5*c[1])
- }
-
- # test functions out - find Chebychev poly for degree-arcsine
- array asc[NMAX]
- echo "Calculating Chebychev polynomial - be patient"
- chebyfit(-1,1,asc,NMAX,DEG*asin(x))
- echo "Evaluating some test values"
- chebyeval(-1,1,asc,20,-1)
- chebyeval(-1,1,asc,20,1)
- chebyeval(-1,1,asc,20,0.5)
- chebyeval(-1,1,asc,20,1/sqrt(2))
-