maurice a écrit :Comment peux-on définir une fonction affine par morceaux avec 3 branches par exemple ?
Avec deux tests... tout simplement... :
Code : Tout sélectionner
real f(real x) {return x <=1.5 ? ((x <=-0.5) ? -2 : -1) : 1;}maurice a écrit :Comment peux-on définir une fonction affine par morceaux avec 3 branches par exemple ?
Code : Tout sélectionner
real f(real x) {return x <=1.5 ? ((x <=-0.5) ? -2 : -1) : 1;}
                                            
                                           
                                           *** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***
                                           
-  
- import graph;
- unitsize(1cm);
- struct jump {
- 	  real x;
- 	  int i;
- 	  void operator init(real x, int i) {
- 	    this.x=x;
- 	    this.i=i;
- 	  }
- }
- void saut(real f(real x),jump ici, real a, real b, pen stylo=black) {
- 	  real epsi=0.001;
- 	  if (ici.i==1) {
- 	  	dot((ici.x,f(ici.x)),stylo);
- 	  	dot((ici.x,f(ici.x+epsi)),stylo,UnFill);
- 	  	draw(graph(f,a,ici.x,n=200),stylo);
- 	  	draw(graph(f,ici.x+epsi,b,n=200),stylo);
- 	  }
- 	  else {
- 	  	dot((ici.x,f(ici.x-epsi)),stylo,UnFill);
- 	  	dot((ici.x,f(ici.x)),stylo);
- 	  	draw(graph(f,a,ici.x-epsi,n=200),stylo);
- 	  	draw(graph(f,ici.x,b,n=200),stylo);
- 	  }
- }
- void multisaut(real f(real x),jump[] listedessauts, real a, real b, pen stylo=black) {
- 	  real epsi=0.001;
- 	  if (listedessauts[0].i==1) {
- 	  	dot((listedessauts[0].x,f(listedessauts[0].x)),stylo);
- 	  	dot((listedessauts[0].x,f(listedessauts[0].x+epsi)),stylo,UnFill);
- 	  	draw(graph(f,a,listedessauts[0].x,n=200),stylo);
- 	  }
- 	  else {
- 	  	dot((listedessauts[0].x,f(listedessauts[0].x-epsi)),stylo,UnFill);
- 	  	dot((listedessauts[0].x,f(listedessauts[0].x)),stylo);
- 	  	draw(graph(f,a,listedessauts[0].x-epsi,n=200),stylo);
- 	  }
- 	  for (int k=1; k<listedessauts.length; k+=1) {
- 	  	if (listedessauts[k].i==1) {
- 	  		dot((listedessauts[k].x,f(listedessauts[k].x)),stylo);
- 	  		dot((listedessauts[k].x,f(listedessauts[k].x+epsi)),stylo,UnFill);
- 	  		if (listedessauts[k-1].i==1) 
- 	  			draw(graph(f,listedessauts[k-1].x+epsi,listedessauts[k].x,n=200),stylo);
- 	  		else 
- 	  			draw(graph(f,listedessauts[k-1].x,listedessauts[k].x,n=200),stylo);
- 	  	}
- 	  	else {
- 		  	dot((listedessauts[k].x,f(listedessauts[k].x-epsi)),stylo,UnFill);
- 		  	dot((listedessauts[k].x,f(listedessauts[k].x)),stylo);
- 		  	if (listedessauts[k-1].i==1) 
- 			  	draw(graph(f,listedessauts[k-1].x+epsi,listedessauts[k].x-epsi,n=200),stylo);
- 			else 
- 				draw(graph(f,listedessauts[k-1].x,listedessauts[k].x-epsi,n=200),stylo);
- 	  	}
- 	  }
- 	  if (listedessauts[listedessauts.length-1].i==1)
- 		  draw(graph(f,listedessauts[listedessauts.length-1].x+epsi,b,n=200),stylo);
- 	  else 
- 	  	  draw(graph(f,listedessauts[listedessauts.length-1].x,b,n=200),stylo);
- }
- real f(real x) {return floor(x);}
- jump[] listedessauts;
-        listedessauts[0]=jump(-2,0);
-        listedessauts[1]=jump(-1,0);
-        listedessauts[2]=jump(0,0);
-        listedessauts[3]=jump(1,0);
-        listedessauts[4]=jump(2,0);
-  
- multisaut(f,listedessauts,-2.5,2.5,red);
-  
- // Définition de la fonction de Heaviside+0.5
- real H(real t) {return (t < 0 ? 0 : 1)+0.5;}
- jump pt=jump(0,0);
- saut(H,pt,-2.5,2.5,blue);
-  
- //Fonction affine par morceaux
- real G(real y) {return y <=-1 ? -y : 1.5*y-1.5;}
- jump ici=jump(-1,1);
- saut(G,ici,-2.5,2.5,green);
-  
- real m(real x) {return x <=1.5 ? ((x <=-0.5) ? -2 : -1) : 1;}
- jump[] la;
-        la[0]=jump(-0.5,1);
-        la[1]=jump(1.5,1);
- multisaut(m,la,-2.5,2.5,yellow);
-  
- xaxis(Arrow);
- yaxis(Arrow);
-  
Code : Tout sélectionner
// Définition de la fonction de Heaviside
real H(real t) {return t < 0 ? 0 : 1;}
// Définition de la fonction
real f(real t){ return H(t)-2*H(t-pi/2)+H(t-pi);}