Red and yellow curves displaced by two pixels so visible.
nomainwin ' use only up to first 8 Tchebyshev terms ( 0 to 7) ' synthesises a cos curve between limits n =200 global pi: pi =4 *atn( 1) for c =0 to 7 c( c) =0 for k =0 to n xk =cos( ( ( 2 *k +1) /(2 *( n +1))) *pi) if c =0 then c( c) =c( c) +( 1 /( n +1)) *funcn( xk) else c( c) =c( c) +( 2 /( n +1)) *funcn( xk) *Tchebyshev( c, xk) end if next k 'print using( "##.####", c( c)) next c print WindowWidth =640 WindowHeight =460 6 open "Tchebyshev" for graphics_nsb as #wg #wg "trapclose quit" #wg "down ; fill darkblue" #wg "color white" for h =0 to 9 step 0.5 if h =5 then #wg "size 2" else #wg "size 1" #wg "up ; goto 0 "; 10 +50 *h; " ; down ; goto 420 "; 10 +50 *h next h for v =0 to 2 if v =1 then #wg "size 2" else #wg "size 1" #wg "up ; goto "; 10 +200 *v; " 0 ; down ; goto "; 10 +200 *v; " 420" next v for x =-1 to 1 step 0.005 print using( "##.##", x), using( "##.####",funcn( x)), #wg "color 255 255 0 ; set "; int( ( x +1) *200 +10); " "; int( 512 -funcn( x) *500) t =0 for c =0 to 7 t =t +c( c) *Tchebyshev( c, x) next c print using( "##.####", t) #wg "color 255 0 255 ; set "; int( ( x +1) *200 +10); " "; int( 510 -t *500) next x #wg "color white ; backcolor darkblue" for i =0 to 7 #wg "up ; goto 450 "; 50 +i *20 #wg "down" #wg "\"; i; " "; using( "##.######", c( i)) next i wait'_____________________________________________________________________ function Tchebyshev( n, x) select case case x >1 Tchebyshev =cosh( n *arcCosh( x)) case x <-1 Tchebyshev =cos( n *arcCosh( x)) case ( ( x >=-1) and ( x <=1)) Tchebyshev =cos( n *acs( x)) end select end function function cosh( x) cosh =0.5 *( exp( x) +exp( 0 -x)) end function function arcCosh( x) if x >1 then arcCosh =log( x +( x^2 -1)^0.5) end function sub quit h$ close #wg end end sub sub delay t timer t *1000, [o] wait [o] timer 0 end sub function funcn( x) funcn =cos( x) 'funcn4 *sin( x)^2 'funcn =exp( x) ' 1.2661 1.1302 0.2715 0.0443 is expected 'funcn =4 *x^2 'funcn =4 *sin( pi *x) end function
Finding coefficient weightings.
WindowWidth = 550 WindowHeight = 400 graphicbox #w.gb1, 10, 10, 520, 220 graphicbox #w.gb2, 10, 240, 520, 100 nomainwin global terms terms =50 '100 '20 '150 '150 dim weighting( terms) open "Analysis of arbitrary waveform as sum of Tchebychev polynomials." for graphics_nsb_nf as #w #w "trapclose [quit]" #w.gb1 "size 2 ; color red" #w.gb1 "up ; goto 10 210 ; down ; backcolor darkblue ; boxfilled 510 10" #w.gb1 "up ; goto 10 110 ; down ; color white ; goto 510 110 ; color red" #w.gb2 "goto 510 50 ; down ; fill darkblue ; color white ; goto 10 50 ; color darkblue ; backcolor cyan" for x =-1 to 1 step 0.002 for tch =0 to terms weighting( tch) =weighting( tch) +fn( x) *tchebychev( tch, x) /1000 next tch next x #w.gb2 "font courier "; str$( int( 3 +terms /30)); " ; color white" for x =0 to terms #w.gb2 "up ; goto "; 10 +x /terms *500; " "; 50 -weighting( x) *50 #w.gb2 "down; boxfilled "; 10 +x /terms *500 +100 /terms; " "; 50 #w.gb2 "up ; goto "; 4 +x /terms *500; " "; 20 #w.gb2 "down" #w.gb2 "|"; x next x for x =-1 to 1 step 0.002 #w.gb1 "color red ; set "; 10 +( x +1) /2 *500; " "; 110 -100 *sumTerms( x) ' tchebychev( n, x) #w.gb1 "color green ; set "; 10 +( x +1) /2 *500; " "; 110 -100 *fn( x) next x #w.gb1 "flush" #w.gb2 "flush" wait [quit] close #w end function tchebychev( n, x) if abs( x) >1 then end tchebychev =cos( n *acs( x)) end function function sumTerms( x) s =0 for j =0 to terms s =s +weighting( j) *tchebychev( j, x) next j sumTerms =s end function function fn( x) 'if x <0 then fn =0 -0.5 -x else fn =0 -0.5 +x 'if x <0 then fn =-1 else fn =1 fn =sin( 2 *3.14159265 *x) 'fn =cos( 2 *3.14159265 *x) 'fn =x 'fn =0.5 'fn =x^2 end function