program ep95_317;

{
   Epreuve informatique de l'Ecole Polytechnique         95.317
   -------------------------------------------------------------


On recherche les solutions de l'équation suivante :

(E)  	a<=t<=b       f(t)=sin t

où t est une inconnue réelle appartenant à un intervalle [a,b] et f(t)
est une fonction réelle continue, calculable et dérivable pour toute valeur
de t appartenant à cet intervalle.


1/ Ecrire un programme Pascal capable de calculer ces solutions (avec la
précision permise par les moyens disponibles) dans le cas où f(t)=ut+v

(E1)	a=<t<=b         ut+v=sin t

Discuter les résultats obtenus selon la valeur des paramètres réels
a, b, u, v.


2/ En conservant pour f(t) la forme précédente, montrer que pour une valeur
de u donnée, le nombre N de solutions de l'équation (E1) admet un maximum.
Dans quels cas ce maximum est-il atteint ?
Montrer sur un graphique la relation qui lie le couple (u,N).

3/  On suppose maintenant que f(t) est de forme sinusoïdale
       f(t)= u sin(wt+phi)+v



(E2) 	a=<t<=b         u sin(wt+phi)+v=sin t


Ecrire un programme Pascal qui calcule les solutions de l'équation (E2).
Discuter le résultat obtenu selon la valeur des paramètres réels
a, b, u, v, w et phi.


4/  On conserve pour f(t) la forme précédente, mais on suppose maintenant
que w  est un nombre rationnel de la forme w=p/q.
Montrer que dans ce cas l'ensemble des solutions de l'équation (E2) a une
structure périodique.
Expliciter cette période et exploiter cette propriété pour améliorer
l'efficacité du programme Pascal qui recherche les solutions.

		
5/ On conserve pour f(t) la forme précédente, on note N le nombre de solutions
de l'équation (E2) et on appelle densité de solutions la quantité

                              N/(b-a)


Montrer que si l'on fait croître l'intervalle [a,b] vers l'infini, cette
densité a une limite d.
Etudier l'influence individuelle de chacun des paramètres u, v, w et phi
sur la valeur de d et en déduire l'ensemble des valeurs possibles du couple
(w, d).


6/ Peut-on concevoir un programme Pascal capable de résoudre l'équation (E
pour n'importe quelle fonction f(t) ?



:--------------------------------------------------------------:
:    Imprimer tous les résultats                               :
:     en indiquant chaque fois à quoi ils correspondent        :
:--------------------------------------------------------------:
                            -=-=-=-
 }


uses
    modubase,crt;


const
     maxn=10;
type
  Myint=Longint;
  Myreal = Real;
  Angle=MyReal;

  Points =record
      x,y:MyReal;
      t:string
  end;
var
   ch:char;
   cas:integer;
   u,v,w,phi:MyReal;
   alpha,beta,gamma:MyReal;


function f(t:real):MyReal;
begin
     case cas of
     1:f:=u*t+v;
     2:f:=u*sin(w*t+phi)+v;
     end; {esac}
end;


procedure Dichotomie(t1,t2:Myreal;VAR t:MyReal);
var
   y1,y2,y:MyReal;
begin
  Couleur(-brillant);
  repeat
     y1:=f(t1)-sin(t1);
     y2:=f(t2)-sin(t2);
     t:=(t1+t2)/2;
     y:=f(t)-sin(t);
     if y*y1>0 then
        t1:=t
     else
        t2:=t;
     Croix(t,sin(t));
     Delay(10);
     Croix(t,sin(t));

  until abs(t1-t2)<0.001;


end;


Function Densite(u,v,w,phi:MyReal):MyReal;
var
   pas:MyReal;
   dx,x,y:Myreal;
   xmax,xmin:MyReal;
   t,t1,t2:real;
   phi1,phi2:angle;
   n:integer;
begin
    xmin:=-10;
    xmax:=+10;
    pas:=0.05;
     cas:=2;
     n:=0;
     if (abs(u))>abs(v) then
       begin
            t:=xmin;
            repeat
                  if f(t)>sin(t) then
                   repeat
                        t:=t+pas
                   until (t>xmax) or (f(t)<sin(t))
                  else
                   repeat
                        t:=t+pas
                   until (t>xmax) or (f(t)>sin(t));
                   if t<xmax then
                      Inc(n);
            until t>xmax;
       end;
       Densite:=n/(xmax-xmin);


end;

procedure Question_1;
var
   xmin,xmax,ymin,ymax:real;
   dx,x,y:Myreal;
   t,t1,t2:real;
   phi1,phi2:angle;
   procedure resultat(t,y:MyReal);
   var
      i:integer;
   begin
        for i:=1 to 10 do
          begin
            Couleur(i);
            Cercle(t,y,i*0.01);
          end;
   end;

begin
     ModeGraphique;
  repeat
     efface;
     xmin:=-20;
     xmax:=20;
     ymin:=-2;
     ymax:=4;
     Fenetre(xmin,xmax,ymin,ymax);
     Couleur(vert);
     X_axe(0,0,1);
     Y_axe(0,0,1);
     Randomize;
     u:=(0.5-random)*4;
     v:=2-4*random;
     Deplace(1,Ymax*0.9);Ecris('  ut+v=sin t');
                         Ecris(' u=');EcrisReel(u);
                         Ecris(' v=');EcrisReel(v);

     dx:=0.1;
     x:=xmin;
     Couleur(Cyan);
     y:=sin(x);
     Deplace(x,y);
     repeat
           x:=x+dx;
           y:=sin(x);
           Trace(x,y);
     until x>xmax;
     cas:=1;
     Couleur(Jaune);
     x:=xmin;
     y:=f(x);
     Deplace(x,y);
     repeat
           x:=x+dx;
           y:=f(x);
           Trace(x,y);
     until x>xmax;
     if u>0 then
       begin
            t1:=-(v+1)/u
            t2:=(1-v)/u;
       end
       else
       begin
            t1:=(1-v)/u;
            t2:=-(v+1)/u;
       end;
       Couleur(Brillant);
       Deplace(t1,u*t1+v);
       Trace(t2,u*t2+v);

     if abs(u)>1 then
       begin
            Dichotomie(t1,t2,t);
             Deplace(1,Ymax*0.8);Ecris('|u|>1 ==> solution unique');
                         Ecris(' t=');EcrisReel(t);
             Resultat(t,sin(t));
       end
     else
       begin
            Couleur(Rouge);
            phi1:=acos(u);
            phi2:=-phi1;
            While phi1<t1 do
                  begin
                       phi1:=phi1+2*pi;
                       phi2:=phi2+2*pi;
                  end;
            While phi2>t1-2*pi do
                  begin
                       phi1:=phi1-2*pi;
                       phi2:=phi2-2*pi;
                  end;
            repeat
                         Dichotomie(phi2,phi1,t);
                         if abs(sin(t)-f(t))<0.001 then
                            Resultat(t,sin(t));
                         Dichotomie(phi1,phi2+2*pi,t);
                         if abs(sin(t)-f(t))<0.001 then
                            Resultat(t,sin(t));
                  phi1:=phi1+2*pi;
                  phi2:=phi2+2*pi;
            until phi2>t2
       end;



     Pause;
  until false;
end;


procedure Question_2
var
   xmin,xmax,ymin,ymax:real;
   pas:MyReal;
   dx,x,y:Myreal;
   t:real;
   n:integer;
   procedure resultat(t,y:MyReal);
   var
      i:integer;
   begin
        Inc(n);
        for i:=1 to 10 do
          begin
            Couleur(i);
            Cercle(t,y,i*0.01);
          end;
   end;

begin
     ModeGraphique;
  repeat
     efface;
     xmin:=-20
     xmax:=20;
     ymin:=-2;
     ymax:=4;
     Fenetre(xmin,xmax,ymin,ymax);
     Couleur(vert);
     X_axe(0,0,1);
     Y_axe(0,0,1);
     Randomize;
     u:=(0.5-random)*4;
     v:=2-4*random;
     w:=random*2;
     phi:=2*pi*random;
     Deplace(1,Ymax*0.9);Ecris('  ut+v=sin t');
                         Ecris(' u=');EcrisReel(u);
                         Ecris(' v=');EcrisReel(v);

     dx:=0.1;
     x:=xmin;
     Couleur(Cyan);
     y:=sin(x);
     Deplace(x,y);
     repeat
           x:=x+dx;
           y:=sin(x);
           Trace(x,y);
     until x>xmax;
     cas:=2;
     Couleur(Jaune);
     x:=xmin;
     y:=f(x);
     Deplace(x,y);
     repeat
           x:=x+dx;
           y:=f(x);
           Trace(x,y);
     until x>xmax;
     if abs(u)+1<abs(v) then
       begin
             Deplace(1,Ymax*0.8);Ecris('|u|+1<|v| ==> pas de solution');
       end
     else
       begin
            pas:=0.01;
            n:=0;
            Couleur(Rouge);
            t:=xmin;
            repeat
                  if f(t)>sin(t) then
                   repeat
                        t:=t+pas
                   until (t>xmax) or (f(t)<sin(t))
                  else
                   repeat
                        t:=t+pas
                   until (t>xmax) or (f(t)>sin(t));
                   if t<xmax then
                      Resultat(t,sin(t));
            until t>xmax;
            Deplace(1,Ymax*0.8);EcrisEntier(n);Ecris(' solutions');
       end;



     Pause;
  until false;
end;


procedure Question_3;
var
   xmin,xmax,ymin,ymax:real;
   pas:MyReal;
   dx,x,y:Myreal;
   t:real;
   n:integer;
   procedure resultat(t,y:MyReal);
   var
      i:integer;
   begin
        Inc(n);
        for i:=1 to 10 do
          begin
            Couleur(i);
            Cercle(t,y,i*0.01);
          end;
   end;

begin
     ModeGraphique;
     efface;
     xmin:=-1;
     xmax:=10;
     ymin:=-1;
     ymax:=10;
     Fenetre(xmin,xmax,ymin,ymax);
     Couleur(vert);
     X_axe(0,0,1);
     Y_axe(0,0,1);
     Deplace(xmax*0.9,0.5);Ecris('w');
     Deplace(0,ymax*0.9);Ecris('d');

     Randomize;
     pas:=0.2;
     repeat
           u:=(0.5-random)*4;
           v:=2-4*random;
           w:=0;
           phi:=1 ;   { phi indifferent }
           Couleur(1+Random(8));
           Deplace(1,ymax*0.9);Ecris(' u=');EcrisReel(u);
                               Ecris(' v=');EcrisReel(v);
           Deplace(w,Densite(u,v,w,phi));
           repeat
                 w:=w+pas;
                 Trace(w,Densite(u,v,w,phi));
           until w>xmax;
           Delay(100);
     until false;
end;

procedure Presentation;
begin;
      Efface;
      WriteLN(' ====== EP 95.317 sinusoïdes  =========  ');
      WriteLN('                                         ');
      WriteLN('                                         ');
      WriteLN('   (1) Solutions de ut+v=sin t           ');
      WriteLN('   (2) Solutions de u sin(wt+phi)=sin t   ');
      WriteLN('   (3) Densite de solutions (w,d)        ');

      WriteLN('                              ');
      Write('   Tapez votre Choix  :  ');
end;


begin
  Randomize;
  InitGraphique;
    repeat
           ModeTexte;
           Presentation;
          Read(Ch);
          case ch of
               '1':  Question_1;
               '2':  Question_2;
               '3':  Question_3;
               '0' : Halt
          end;
    until false;
end.
