Scilab et la dynamique de l'approximation diophantienne d'un réel

Scilab  cf help('int'), etc

Etude du système dynamique x -> 1/(x-int(x)) sur [1,\infty[\Q ou de façon equivalente x \mapsto 1/x - int(1/x) sur [0,1]\Q. C'est ce dernier qu'on représente graphiquement.

Le calcul du spectre de matrices 2x2 de la forme [k,1;1,0] ou d'un produit de matrices de cette forme sert à trouver les points fixes de l'extension à P^1(R) d'une section de f ou d'une composée de telles sections, ce qui donne des points fixes de f ou de composées de f avec elle même.

Les erreurs de calculs propres à l'approximation décimale tronquée d'un réel dans scilab conduisent à des phénomènes abérents : en prenant x=1.61, on devrait obtenir une erreur de division par 0 après 9 itérations de f (les itérés de f ne sont définis qu'en dehors des nombres rationnels). Or on obtient un phénomène périodique stable de période 4. Sauf erreur de ma part le système dynamique associé à f n'a pas d'orbite périodique stable.
En fait l'erreur dans le calcul de f(x) est multipliée par x*f(x) (>2) lors de chaque itération. Les valeurs trouvées après itérations n'ont très vite aucune pertinence.

-->//Calcul de valeurs propres et de vecteurs propres

--> A=[1,1;1,0];[D,P]=bdiag(A)
 P  =

    0.8506508  - 0.5257311
    0.5257311    0.8506508
 D  =

    1.618034    0.
    0.        - 0.6180340

--> A*P(:,1)-D(1,1)*P(:,1) //verification
 ans  =

    0.
    0.

-->//points fixes des sections de f

--> x=[];for i=1:10;a=spec([i,1;1,0]);x(i)=a(2);end;x
 x  =

    1.618034
    2.4142136
    3.3027756
    4.236068
    5.1925824
    6.1622777
    7.1400549
    8.1231056
    9.1097722
    10.09902

--> (1+sqrt(5))/2
 ans  =

    1.618034

-->1/(sqrt(2)-1)
 ans  =

    2.4142136

--> function y=f(x);y=1/(x-int(x));endfunction

-->// Comportement des iteres de f au voisinage du premier point fixe

--> y=[];y(1)=(1+sqrt(5))/2;for i=1:1000;y(i+1)=f(y(i));end;
--> clf();plot2d(1:1000,y(1:1000).^(-1),0)


-->// Points de periode 2

-->[D,P]=bdiag([1,1;1,0]*[2,1;1,0])
 P  =

    0.8068982  - 0.3577590
    0.5906905    0.9774159
 D  =

    3.7320508    0.
    0.           0.2679492

-->a=P(1,1)/P(2,1)
 a  =

    1.3660254

-->function []=dessin(a,n);y=[];y(1)=a;for i=1:n-1;y(i+1)=f(y(i));end;plot2d(1:n,y(1:n).^(-1),0);endfunction

-->clf();dessin(a,100)

-->//Rq sur le spectre :

-->a=bdiag([5,1;1,0]*[3,1;1,0]*[4,1;1,0])
 a  =

    72.013886    0.
    0.         - 0.0138862

-->x=[];for i=1:100;a=spec([i,1;1,0]);x(i)=a(2);end;
-->x(find(x>72,1))
 ans  =

    72.013886

-->a(1,1)-x(find(x>72,1))
 ans  =

    1.421D-14

-->// Les iteres de f ne sont pas definis sur les nombres rationnels :

-->function i=g(a,b);i=1;while b<>0;r=a-int(a/b)*b;a=b;b=r;i=i+1;end;endfunction

-->g(1618034,1000000) //nbre d'iterations pour une division par zero si les calculs etaient exacts
 ans  =

    23.

-->2*log(1618034)/log(2)
 ans  =

    41.251621

-->clf();dessin(
1.618034,24)

-->clf();dessin(1.6,24) //essai avec un nbre rationnel plus proche d'un entier
 !--error 27
division by zero...
at line       2 of function f called by :
line     2 of function dessin called by :
clf();dessin(1.6,24)

-->g(16,10)
 ans  =

    5.

-->g(161,100)
 ans  =

    9.

-->clf();dessin(1.61,100) //Y aura t-il une erreur de division par 0 ?

-->clf();dessin(1.61,10000)

-->// Controle de la precision dans l'approximation decimale d'un reel par Scilab

-->number_properties("radix")
 ans  =

    2.

-->number_properties("digits")
 ans  =

    53.

-->a=(1+sqrt(5))/2;log(a-f(a))/log(2)
 ans  =

  - 52.

-->b=2*log(a)/log(2) //nbre theorique de chiffres significatifs perdus sur les 53 (en base 2) lors de chaque iteration
 b  =

    1.38848382726123476

-->53/b //nbre theorique d'iterations avant une erreur de l'ordre de grandeur de a
 ans  =

    38.1711323959327444

-->clf();dessin(a,40)


-->log(abs(y(37)-a))/log(2) //ecart avec a après 36 iterations
 ans  =

  - 3.58964805665926656

-->53-36*b //ecart theorique
 ans  =

    3.01458221859554953

-->// intervalle de confiance - on approxime f([a-eps,a+eps]) par [f(a-eps),f(a+eps)] valable si [a-eps,a+eps] est inclu dans un intervalle ]k,k+1[. Si
]a-eps,a+eps[ contient un entier alors f(]a-eps,a+eps[) est ]1,+infty[

-->// Troncature decimale vecue :
 
-->a=(1+sqrt(5))/2;[(a+2^(-53))-a,(a+2^(-52))-a]
 ans  =

    0.    2.220D-16

-->function []=dessin(a,n);y1(1)=a-2^(-52);y2(1)=a+2^(-52);for i=1:n-1;y1(i+1)=f(y1(i));y2(i+1)=f(y2(i));end; xset("color",color(230,230,230));for i=1:10;xfrect(0,1/(2*i),40,1/(2*i*(2*i+1)));end;for i=1:n;plot2d([i,i],[1/y1(i),1/y2(i)],style=1);end;endfunction

Warning :redefining function: dessin


-->clf();dessin((1+sqrt(5))/2,40) // a comparer avec la derniere figure ci-dessus :

-->clf();dessin(1.61,40) //a comparer avec le phenomene de periodicite observe plus haut :


-->//Points de periode 7 ?

-->[D,P]=bdiag([1,1;1,0]*[2,1;1,0]*[9,1;1,0]*[4,1;1,0]*[5,1;1,0]*[6,1;1,0]*[7,1;1,0]);clf();dessin(P(1,1)/P(2,1),40)





fx dehon, 24 janvier 2008