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