Einfacher Fall : (Es wird noch weitaus spannender)
Umkehrfunktion der analytischen Loesung (r=4) fuer diskrete ganzzahlige Abtastwerte.
************************************************** *************
Beispiel :
Zehn Iterationen mit dem Startwert 0.2.
y[0] := .2
y[1] := .64
y[2] := .9216
y[3] := .28901376
y[4] := .8219392261228
y[5] := .5854205387340
y[6] := .9708133262496
y[7] := .1133392473032
y[8] := .4019738492956
y[9] := .9615634951124
Umindizierung fuert auf die Umkehrfunktion :
yi[0] := .9615634951124
yi[1] := .4019738492956
yi[2] := .1133392473032
yi[3] := .9708133262496
...
yi[9] := .2
Die Reihe soll durch die Umkehrfunktion der analytischen Loesung erzeugt werden :
yi[k]:=(1/2*(1-cos(2^(-k)*(arccos(1-2*y[0])+n*2*Pi))));
k gibt den Zeitschritt an
n gibt den Loesungszweig an. Fuer den k ten Iterationsschritt wird die Funktion n=2^k mehrdeutig sein.
Bsp:
Ist die Funktion 2 deutig so kann gelten n=0 (2,4,6..) oder n=1 (3,5,7..)
Ist die Funktion 4 deutig so kann gelten n=0 oder n=1 oder n=2 oder n=3.
Der Index n stellt eine fehlende Information dar. Der Informationsverlust steigt wie in der rein diskreten Anschauung ueber das Vorzeichen mit jeder Iteration. Sehr schnell wird die Funktion hochgradig mehrdeutig sein. (Im kontinuierlichen Fall wird der Sachverhalt noch erstaunlicher und komplexer sein)
Beispielcode fuer manuelle Suchen von n :
> for k from 0 to 4 do
> ziel:=yi[k];
> for n from 0 to 8 do
> test:=evalf(1/2*(1-cos(2^(-k)*(arccos(1-2*yi[0])+n*2*Pi))));
> printf(`%g `,test);
> od; od;
Ausdruck :
Zitat:
ziel := .9615634951124
.961563 .961563 .961563 .961563 .961563 .961563 .961563 .961563 .961563
ziel := .4019738492956
.401973 .598026 .401973 .598026 .401973 .598026 .401973 .598026 .401973
ziel := .1133392473032
.113339 .817007 .886660 .182992 .113339 .817007 .886660 .182992 .113339
ziel := .9708133262496
.029186 .286111 .668329 .951942 .970813 .713888 .331670 .048057 .029186
ziel := .5854205387340
.007350 .077540 .212045 .390389 .585420 .767447 .908757 .987837 .992649
|
Einfache automatisierte Suche fuer den Index n :
restart;
Digits:=13;
> M:=7;
> y[0]:=0.2;
> for i from 1 to M-1 do
> y[i]:=y[i-1]*4*(1-y[i-1]);
> od:
> for i from 0 to M-1 do
> yi[i]:=y[M-i-1];
> od;
>
> for k from 0 to M-1 do
> ziel:=yi[k];
> for n from 0 to 2^k do
> test:=evalf(1/2*(1-cos(2^(-k)*(arccos(1-2*yi[0])+n*2*Pi))));
> if ceil(1000000*ziel)=ceil(1000000*test) or
> floor(1000000*ziel)=floor(1000000*test)
> then
> printf(`n=%g test=%1.13g`,n,test);
> index[k]:=n;
> n:=2^k;
> fi;
> od; od;
Das bereits etwas verblueffende Ergebnis :
Zitat:
ziel := .9615634951124
n=0 test=.9615634951125
ziel := .4019738492956
n=0 test=.4019738492958
ziel := .1133392473032
n=0 test=.1133392473032
ziel := .9708133262496
n=4 test=.9708133262496
ziel := .5854205387340
n=4 test=.5854205387340
ziel := .8219392261228
n=20 test=.8219392261227
ziel := .28901376
n=52 test=.2890137600000
ziel := .9216
n=52 test=.9216000000000
ziel := .64
n=180 test=.6399999999998
ziel := .2
n=436 test=.2000000000000
|
Indizes des Beispiels :
0,0,0,4,4,20,52,52,180,436
1,2,4,8,16... fach
Der Wert 2^k waechst exponentiell. (2^9=512). Bereits fuer 20 Iterationen wird die Indexsuche recht zeitaufwaendig. Hier die Indizes fuer 18 Iterationen :
0 0 0 0 0 0 0 64 64 64 576 1600 3648 3648 11840 11840 11840 53695