Van der Waerdenin funktio 

Jatkuva funktio, jolla ei ole missään derivaatta. 

25.03.08  Heikki Apiola 

Liittyy Markku Halmetojan kirjoitukseen Solmun numerossa 2/2008. 

                                                                                                 

Apufunktioita: Jaksollinen jatko: JJ 

Aivan kuten Fourier-sarjoissa, tässä on erinomaisen hyödyllinen väline operaattori, joka suorittaa jaksollisen jatkamisen.  

Hieno toteutus on peräisin  Maple-gurulta: Mike Monaganilta 

> restart:
 

> with(plots):
 

>
 

 

> # Jaksollinen jatko: MapleTech Vol 3 No. 3 1996 (Mike Monagan)
#
JJ:=proc(f,d::range)
 subs({'F'=f,'L'=lhs(d),'D'=rhs(d)-lhs(d)},
 proc(x::algebraic) local y;
   y:=floor((x-L)/D);
   F(x-y*D);
 end)
end:

# Esim:
#sw:=JJ(signum,-1..1);
#plot(sw,-4..4);
#
 

Määritellään  

> #g:=x->abs(x-floor(2*x));
 

> #plot(g,0..1);   # Tässä tulee ikävästi pystyviiva.
 

Maplessa voidaan määritellä funktio paloittain. Tässä on selkeä "aaltosulkufunktion" (etäisyys lähimmästä kokonaisluvusta) 

määritelmä välillä [0,1]: 

> g:=x->piecewise(x >=0 and x <=1/2,x,x>1/2 and x <=1,1-x);
 

proc (x) options operator, arrow; piecewise(`and`(`<=`(0, x), `<=`(x, `/`(1, 2))), x, `and`(`<`(`/`(1, 2), x), `<=`(x, 1)), `+`(1, `-`(x))) end proc (2.1)
 

> #plot(g,0..1);
 

>
 

    Jatketaan jaksollisena, jaksovälinä [0,1]. 

> G:=JJ(g,0..1);
 

proc (`::`(x, algebraic)) local y; `:=`(y, floor(x)); g(`+`(x, `-`(y))) end proc (2.2)
 

> plot(G,-5..5,numpoints=300);
 

Plot_2d
 

>
 

 

>
 

>
 

Määritellään sarjan osasummafunktio: 

> osasumma:=N->sum(G((10)^k*x)/10^k,k=0..N);
 

proc (N) options operator, arrow; sum(`/`(`*`(G(`*`(`^`(10, k), `*`(x)))), `*`(`^`(10, k))), k = 0 .. N) end proc (2.3)
 

> osasumma(2);
 

`+`(piecewise(`and`(`<=`(0, `+`(x, `-`(floor(x)))), `<=`(`+`(x, `-`(floor(x))), `/`(1, 2))), `+`(x, `-`(floor(x))), `and`(`<`(`/`(1, 2), `+`(x, `-`(floor(x)))), `<=`(`+`(x, `-`(floor(x))), 1)), `+`(1,...
`+`(piecewise(`and`(`<=`(0, `+`(x, `-`(floor(x)))), `<=`(`+`(x, `-`(floor(x))), `/`(1, 2))), `+`(x, `-`(floor(x))), `and`(`<`(`/`(1, 2), `+`(x, `-`(floor(x)))), `<=`(`+`(x, `-`(floor(x))), 1)), `+`(1,...
`+`(piecewise(`and`(`<=`(0, `+`(x, `-`(floor(x)))), `<=`(`+`(x, `-`(floor(x))), `/`(1, 2))), `+`(x, `-`(floor(x))), `and`(`<`(`/`(1, 2), `+`(x, `-`(floor(x)))), `<=`(`+`(x, `-`(floor(x))), 1)), `+`(1,...
(2.4)
 

> plot([osasumma(0),osasumma(1),osasumma(2),osasumma(3)],x=-1..1,color=[red,green,blue,black]);
 

Plot_2d
 

> plot([osasumma(5),osasumma(10)],x=0..1,numpoints=800,color=[red,blue]);
 

Plot_2d
 

 

> plot([osasumma(5),osasumma(10)],x=0..0.1,numpoints=800,color=[red,blue]);
 

Plot_2d
 

> plot([osasumma(5),osasumma(10)],x=0..0.01,numpoints=800,color=[red,blue]);
 

Plot_2d
 

Kun väliä pienennetään, niin kulmikkuus säilyy. Piirroksissa on otettu osasummat 5 ja 10. Sarja suppenee niin nopeasti, että kuvan tarkkuudella 

eroa ei näy.  

> plot([osasumma(5),osasumma(10),osasumma(50)],x=0..0.000001,numpoints=800,color=[red,blue,black]);
 

Plot_2d
 

>
 

Jos väliä pienennetään riittävästi, niin osasumma 5 antaa väärän kuvan asiasta. Edellä osasumma 10 riittää, koska osasumma 50 ei muuta kuvaa 

piirroksen tarkkuudella. 

Yksi olennainen piirre on tietysti se, että kyseessä on sarja eikä äärellinen summa. Siten aina, kun x-aluetta piennetään riittävästi, on otettava 

lisää termejä summaan, jotta ilmiö saataisiin näkyviin. 

>