%======================Fonctionsusuelles====================================== numeric Pi,E; Pi:= 3.14159; E:= 2.7182; vardef sin(expr x) = sind(x/Pi*180) enddef; vardef cos(expr x) = cosd(x/Pi*180) enddef; vardef tan(expr x) = sin(x)/cos(x) enddef; vardef exp(expr x) = mexp(x*256) enddef; vardef ln(expr x) = mlog(x)/256 enddef; % Dfinition du repre =================================================== def repere(expr Ox,Oy,Xmin,Xmax,Ymin,Ymax,Ux,Uy) = % affectations des variables _ox := Ox ; _oy := Oy ; _ux := Ux ; _uy := Uy; _e := e; _xmin := Xmin ; _xmax := Xmax ; _ymin := Ymin ; _ymax := Ymax; _r_xmin := _xmin*_ux+_ox; % l'abscisse minimale _r_xmax := _xmax*_ux+_ox; %l'abscisse maximale _r_ymin := _ymin*_uy+_oy; %l'ordonne minimale _r_ymax := _ymax*_uy+_oy %l'ordonne maximale enddef; % Placer les axes du repre ============================================== def r_axes = %pickup pencircle scaled 1.2pt; drawarrow (_r_xmin,_oy)..(_r_xmax,_oy); drawarrow (_ox,_r_ymin)..(_ox,_r_ymax); pickup pencircle scaled 0.5pt; label.bot(btex $x$ etex, (_r_xmax-1mm,_oy)); label.lft(btex $y$ etex, (_ox,_r_ymax-1mm)) enddef; % Placer l'origine ======================================================= def r_origine = label.lft(btex $O$ etex,(_ox,_oy-2mm)); pickup pencircle scaled 3pt; draw (_ox,_oy); pickup pencircle scaled 0.5pt enddef; %Graduation des units =================================================== def r_unites = draw (_ox+_ux,_oy-1mm)--(_ox+_ux,_oy+1mm); draw(_ox-1mm,_oy+_uy)--(_ox+1mm,_oy+_uy) enddef; %Graduation des axes ===================================================== def grad_x(expr n,m,couleur) = numeric _m; _m:=m; % pickup pencircle scaled 0.1pt; for i=1 upto (floor(-_xmin+1))/n: draw (-i*n*_ux,_oy-1mm)--(-i*n*_ux,_oy+1mm) withcolor _m*couleur; endfor for i=1 upto (floor(_xmax+1))/n: draw (i*n*_ux,_oy-1mm)--(i*n*_ux,_oy+1mm) withcolor _m*couleur; endfor enddef; def grad_y(expr n,m,couleur) = numeric _m; _m:=m; %pickup pencircle scaled 0.1pt; for i=1 upto (floor(-_ymin+1))/n: draw (_ox-1mm,-i*n*_uy)--(_ox+1mm,-i*n*_uy) withcolor m*couleur; endfor for i=1 upto (floor(_ymax+1))/n: draw (_ox-1mm,i*n*_uy)--(_ox+1mm,i*n*_uy) withcolor m*couleur; endfor enddef; %Quadrillage==================%suppose que xmin est ngatif et xmax positif========= def quad_x(expr n,m,couleur) = numeric _a,_b,_c,_d,_m; _m:=m; _a = floor(_xmin)*_ux+_ox; _b = floor(_ymin)*_uy+_oy; _c = (floor(_xmax)+1)*_ux+_ox; _d = (floor(_ymax)+1)*_uy+_oy; %pickup pencircle scaled 0.1pt; for i=1 upto (floor(-_xmin+1))/n: draw (-i*n*_ux,_b)--(-i*n*_ux,_d) withcolor _m*couleur; endfor for i=1 upto (floor(_xmax+1))/n: draw (i*n*_ux,_b)--(i*n*_ux,_d) withcolor _m*couleur; endfor enddef; def quadunite_x(expr m,couleur) = numeric _a,_b,_c,_d; _a = floor(_xmin)*_ux+_ox; _b = floor(_ymin)*_uy+_oy; _c = (floor(_xmax)+1)*_ux+_ox; _d = (floor(_ymax)+1)*_uy+_oy; pickup pencircle scaled 0.3pt; for i=0 upto (floor(_xmax)+1-floor(_xmin)) -1: draw (_a+i*_ux,_b)--(_a+i*_ux,_d) withcolor m*couleur; endfor enddef; def quad_y(expr n,m,couleur) = numeric _a,_b,_c,_d; _a = floor(_xmin)*_ux+_ox; _b = floor(_ymin)*_uy+_oy; _c = (floor(_xmax)+1)*_ux+_ox; _d = (floor(_ymax)+1)*_uy+_oy; %pickup pencircle scaled 0.1pt; for i=1 upto (floor(-_ymin+1))/n: draw (_a,-i*n*_uy)--(_c,-i*n*_uy) withcolor m*couleur; endfor for i=1 upto (floor(_ymax+1))/n: draw (_a,i*n*_uy)--(_c,i*n*_uy) withcolor m*couleur; endfor enddef; def quadunite_y(expr m,couleur) = numeric _a,_b,_c,_d; _a = floor(_xmin)*_ux+_ox; _b = floor(_ymin)*_uy+_oy; _c = (floor(_xmax)+1)*_ux+_ox; _d = (floor(_ymax)+1)*_uy+_oy; pickup pencircle scaled 0.3pt; for i=0 upto (floor(_ymax)+1-floor(_ymin)) -1: draw (_a,_b+i*_uy)--(_c,_b+i*_uy) withcolor m*couleur; endfor enddef; %Dfinir un point dans ce plan =========================================== def r_point(expr x,y) = (_ox+x*_ux,_oy+y*_uy) enddef; %Placer un point plein dans ce repre ==================================== def r_ppoint(expr x,y) = pickup pencircle scaled 3pt; draw (_ox+x*_ux,_oy+y*_uy); pickup pencircle scaled 0.5pt enddef; %Placer un point creux dans ce repre ==================================== def r_cpoint(expr x,y) = path _e; _e = fullcircle scaled 3pt shifted(_ox+x*_ux,_oy+y*_uy); draw _e; fill _e withcolor white enddef; %Label des units ======================================================== def r_labelxy = label.bot(btex $+1$ etex,(_ox+_ux,_oy-1mm)); label.lft(btex $+1$ etex, (_ox-1mm,_oy+_uy)) enddef; %Definir un segment ================================================ def r_segment(expr a,b,c,d) = (_ox+a*_ux,_oy+b*_uy)--(_ox+c*_ux,_oy+d*_uy) enddef; %Definir une droite // l'axe des ordonnes ============================= def rx_droite(expr k) = (_ox+k*_ux,_r_ymin)--(_ox+k*_ux,_r_ymax) enddef; %Definir une droite dfinie par un point et son coeff dir ================ def r_droitedir(expr a,b,m) = (_r_xmin,_oy+(m*_xmin+b-m*a)*_uy)--(_r_xmax,_oy+(m*_xmax+b-m*a)*_uy) enddef; %Projection d'un point sur les axes ====================================== def r_point_proj(expr x,y) = draw(_ox+x*_ux,_oy)--(_ox+x*_ux,_oy+y*_uy)--(_ox,_oy+y*_uy) dashed evenly; r_ppoint(x,y) enddef; %On enlve ce qui sort du repre ========================================= def r_fin = clip currentpicture to (_r_xmin,_r_ymin)--(_r_xmin,_r_ymax)-- (_r_xmax,_r_ymax)--(_r_xmax,_r_ymin)--cycle enddef; %Tracer des courbes en dimension 2 ======================================= %Sont prdfinies avant beginfig les expressions fx(t) et fy(t)=========== vardef f_point(suffix fx,fy)(expr t) = r_point(fx(t),fy(t)) enddef; vardef fy_val(suffix fx,fy)(expr t) = fy(t) enddef; vardef f_courbe(suffix fx,fy)(expr ti,tf,n) = f_point(fx,fy,ti) for i=1 upto n: ...f_point(fx,fy,ti+(i/n)*(tf-ti)) endfor enddef; %Drive de f sous rserve d'existence===================================== vardef fx_derive(suffix fx)(expr a,h) = ((fx(a+h))-(fx(a)))/h enddef; vardef fy_derive(suffix fy)(expr a,h) = ((fy(a+h))-(fy(a)))/h enddef; %Tangente la courbe en un point rgulier tel que x'(t) diffrent de 0===== vardef f_tangente(suffix fx,fy)(expr a,h) = r_droitedir(fx(a),fy(a),(fy_derive(fy,a,h))/(fx_derive(fx,a,h))) enddef; %Trac de la tangente en un point rgulier tel que x'(t) diffrent de 0===== vardef tracef_tangente(suffix fx,fy)(expr a,b,h,couleur) = pair _f[]; _f1=f_point(fx,fy,a)+b*(1*_ux,(fy_derive(fy,a,h))/(fx_derive(fx,a,h))*_uy); _f2=f_point(fx,fy,a)-b*(1*_ux,(fy_derive(fy,a,h))/(fx_derive(fx,a,h))*_uy); drawdblarrow _f1.._f2 withcolor couleur; pickup pencircle scaled 0.5pt; r_ppoint(fx(a),fy(a)) enddef; %==========================Suites numeriques================================= %suites u(n)=f(n) vardef u_courbe(suffix ux,uy)(expr ni,nf,t) = drawoptions( dashed evenly); draw f_point(ux,uy,ni) for i=ni upto nf: ...f_point(ux,uy,i) endfor ; drawoptions( ); pickup pencircle scaled 3pt; for i=ni upto nf: draw f_point(ux,uy,i); %dotlabel.bot(""&decimal i, r_point(i,0)); %dotlabel.lft("u"&decimal i, r_point(0,uy(i)); endfor ; if t=1: for j=ni upto nf: u[j] = uy(j); write "dotlabel.lft" & "(btex $u_{"&decimal j&"}$ etex,r_point(0,u["&decimal j&"]));" to "toto.tmp"; dotlabel.bot(""&decimal j, r_point(j,0)); endfor; write EOF to "toto.tmp"; scantokens "input toto.tmp"; fi; pickup pencircle scaled 0.5pt enddef; %calcul d'un terme quelconque de la suite u(n+1)=f(u(n)) partir d'un autre prcdent dans la liste %suites u(n+1)=f(u(n)) vardef u_rec(suffix fx,fy)(expr d,i,n) = numeric u[]; u[i] = d; for j=i upto n: u[j+1] = fy(u[j]); endfor; u[n] enddef; %courbes suites u(n+1)=f(u(n)) vardef u_reccourbe (suffix fx,fy) (expr d,i,n,ni,nf,t) = draw f_courbe(fx,fy,ni,nf,100); draw r_droitedir(0,0,1); numeric u[]; u[i] = d; for j=i upto n-1: u[j+1] = fy(u[j]); draw r_point(u[j+1],0)--r_point(u[j+1],u[j+1]) dashed evenly; if j > i: draw r_point(u[j],u[j])--f_point(fx,fy,u[j])--r_point(u[j+1],u[j+1]); fi; endfor; draw r_point(u[i],0)--f_point(fx,fy,u[i])--r_point(u[i+1],u[i+1]); if t=1: for j=0 upto n: write "dotlabel.bot" & "(btex $u_{"&decimal j&"}$ etex, r_point(u["&decimal j&"],0));" to "toto.tmp"; endfor; write EOF to "toto.tmp"; scantokens "input toto.tmp"; fi; enddef; %============================integration=================================== %Pompe en partie sur le net chez Vincent Zoonekynd.....merci a lui %rectangles gauche, on commence avec une hauteur qui est l'image du premier point de la subdivision, la somme des aires ne minore donc pas en general integrale de f sur [a,b] vardef trace_rectangles_left (suffix fx,fy)(expr a,b,inc) = %sur l'intervalle [a,b] avec un pas de inc save i; numeric i; for i=a step inc until b-inc: path p; p = r_point(i,0)--r_point(i+inc,0)--r_point(i+inc,fy(i))--r_point(i,fy(i))--cycle; %p := p scaled 1cm; %fill p withcolor .8*white; draw p; endfor; enddef; %rectangles droite, on commence avec une hauteur qui est l'image du premier point +inc de la subdivision, la somme des aires ne minore donc pas en general integrale de f sur [a,b] vardef trace_rectangles_right (suffix fx,fy)(expr a,b,inc) =%sur l'intervalle [a,b] avec un pas de inc save i; numeric i; for i=a step inc until b-inc: path p; p = r_point(i,0)--r_point(i+inc,0)--r_point(i+inc,fy(i+inc))--r_point(i,fy(i+inc))--cycle; %p := p scaled 1cm; %fill p withcolor .8*white; draw p; endfor; enddef; %methode des trapezes vardef trace_trapezes (suffix fx,fy)(expr a,b,inc) = save i; numeric i; for i=a step inc until b-inc: path p; p = r_point(i,0)--r_point(i+inc,0)--r_point(i+inc,fy(i+inc))--r_point(i,fy(i))--cycle; %p := p scaled 1cm; %fill p withcolor .8*white; draw p; endfor; enddef; %une macro non parfaite pour obtenir le min de f sur un intervalle, cela suppose qu'elle soit bien reguliere...... vardef minf(suffix fx,fy)(expr a,b) = save m,i; numeric m,i; m:=fy(a); for i=a step (b-a)/100 until b: if m>fy(i): m:=fy(i); fi; endfor; m enddef; %rectangle en dessous de la courbe, utilise la macro precedente vardef trace_rectangles_min (suffix fx,fy)(expr a,b,inc) = save i; numeric i; for i=a step inc until b-inc: path p; numeric m; m:=minf(fx,fy,i,i+inc); p = r_point(i,0)--r_point(i+inc,0)--r_point(i+inc,m)--r_point(i,m)--cycle; %p := p scaled 1cm; %fill p withcolor .8*white; draw p; endfor; enddef; %une macro non parfaite pour obtenir le max de f sur un intervalle, cela suppose qu'elle soit bien reguliere...... vardef maxf(suffix fx,fy)(expr a,b) = save m,i; numeric m,i; m:=fy(a); for i=a step (b-a)/100 until b: if m(-1,-1): draw support shifted (ecart*j*(cm,0)) withcolor couleur; fi endfor; ); clip $ to chemin; drawoptions(); $ enddef;