verbatimtex %&latex \documentclass{article} \usepackage[upright]{fourier} \usepackage{preambule} \begin{document} etex %input latexmp; %======================Fonctionsusuelles====================================== numeric Pi,E; Pi:= 3.14159265359; 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; % D�inition du rep�e =================================================== def repere(expr Ox,Oy,Xmin,Xmax,Ymin,Ymax,Ux,Uy) = % affectations des variables _ux := Ux ; _uy := Uy;_ox := Ox*_ux ; _oy := Oy*_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'ordonn� minimale _r_ymax := _ymax*_uy;%+_oy %l'ordonn� maximale enddef; % Placer les axes du rep�e ============================================== def r_axes = pickup pencircle scaled 1.1bp; 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 les axes du rep�e avec noms diff�ents============================================== def r_axenom(expr a,b) = pickup pencircle scaled 1.5bp; drawarrow (_r_xmin,_oy)..(_r_xmax,_oy); drawarrow (_ox,_r_ymin)..(_ox,_r_ymax); pickup pencircle scaled 0.5pt; label.bot(a, (_r_xmax-1.5mm,_oy)); label.lft(b, (_ox,_r_ymax-1.5mm)); 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 unit� =================================================== def r_unites = pickup pencircle scaled 1.4bp; draw (_ox+_ux,_oy-1mm)--(_ox+_ux,_oy+1mm); draw(_ox-1mm,_oy+_uy)--(_ox+1mm,_oy+_uy); label.bot(btex $\Mathbold{1}$ etex,(_ox+_ux,_oy-1mm)); label.lft(btex $\Mathbold{1}$ etex, (_ox-1mm,_oy+_uy)); enddef; %Graduation des axes ===================================================== def grad_x(expr n,m,couleur) = for i=1 upto (floor(-_xmin+1))/n: draw (-i*n*_ux,_oy-.1cm)--(-i*n*_ux,_oy+.1cm) withcolor couleur; endfor picture v[]; for i=1 upto (floor(-_xmin+1))/m: write "v["&decimal (i)&"]:=btex $" & decimal(-i*m) & "$ etex;" to "mptextmp.mp"; endfor write EOF to "mptextmp.mp"; scantokens "input mptextmp"; for i=1 upto (floor(-_xmin+1))/m: label.bot(v[i], (-i*m*_ux,_oy-1mm)) withcolor couleur; endfor %for i=1 upto (floor(-_xmin+1))/m: % label.bot(textext("$" & (decimal(-i*m)) & "$"), (-i*m*_ux,_oy-1mm)) withcolor couleur; %endfor for i=1 upto (floor(_xmax-0.5))/n: draw (i*n*_ux,_oy-.1cm)--(i*n*_ux,_oy+.1cm) withcolor couleur; endfor for i=1 upto (floor(_xmax-1))/m: label.bot (str[i*m], (i*m*_ux,_oy-1mm)) withcolor couleur; endfor enddef; def grad_y(expr n,m,couleur) = numeric _m; _m:=m; for i=1 upto (floor(-_ymin+1))/n: draw (_ox-.1cm,-i*n*_uy)--(_ox+.1cm,-i*n*_uy) withcolor couleur; endfor for i=1 upto (floor(-_ymin+1))/m: label.lft (str[i*m],(_ox-.1cm,i*n*_uy) ) withcolor couleur; endfor for i=1 upto (floor(_ymax-0.5))/n: draw (_ox-.1cm,i*n*_uy)--(_ox+.1cm,i*n*_uy) withcolor couleur; endfor for i=1 upto (floor(_ymax-1))/m: label.lft (str[i*m], (_ox-.1cm,i*m*_uy)) withcolor couleur; endfor picture u[]; for i=1 upto (floor(-_ymin+1))/m: write "u["&decimal (i)&"]:=btex $" & decimal(-i*m) & "$ etex;" to "mptextmp.mp"; endfor write EOF to "mptextmp.mp"; scantokens "input mptextmp"; for i=1 upto (floor(-_ymin+1))/m: label.lft(u[i],(_ox-.1cm,-i*n*_uy) ) withcolor couleur; endfor %for i=1 upto (floor(-_ymin+1))/m: % label.lft(textext("$" & (decimal(-i*m)) & "$"),(_ox-1mm,-i*n*_uy) ) withcolor couleur; %endfor enddef; % Quadrillage==================%suppose que xmin est n�atif et xmax positif========= def quad_x(expr n,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 couleur; endfor for i=1 upto (floor(_xmax+1))/n: draw (i*n*_ux,_b)--(i*n*_ux,_d) withcolor couleur; endfor enddef; def quadunite_x(expr 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.4pt; for i=0 upto (floor(_xmax)+1-floor(_xmin)) -1: draw (_a+i*_ux,_b)--(_a+i*_ux,_d) withcolor couleur; endfor enddef; def quad_y(expr n,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 couleur; endfor for i=1 upto (floor(_ymax+1))/n: draw (_a,i*n*_uy)--(_c,i*n*_uy) withcolor couleur; endfor enddef; def quadunite_y(expr 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.4pt; for i=0 upto (floor(_ymax)+1-floor(_ymin)) -1: draw (_a,_b+i*_uy)--(_c,_b+i*_uy) withcolor couleur; endfor enddef; def quad_xy(expr n,couleur) = quad_x(n,couleur); quad_y(n,couleur); enddef; def quadu_xy(expr couleur) = quadunite_x(couleur); quadunite_y(couleur); enddef; def quad_logx(expr n,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; path p; p:=(0,_b)--(0,_d); for k:=0 step 1 until 10 : for j:=1 step 1 until 10 : draw p shifted ((k*ln(10)+ln(j))*cm,0); endfor; endfor; pickup pencircle scaled 0.7; for j:= step 1 until x.ne : draw p shifted (j*ln(10)*cm,0); endfor; enddef; %D�inir un point dans ce plan =========================================== def r_point(expr x,y) = (x*_ux,y*_uy) enddef; def r_p(expr x,y) = r_point(x,y) enddef; %Placer un point plein dans ce rep�e ==================================== def r_ppoint(expr x,y) = pickup pencircle scaled 3pt; draw (x*_ux,y*_uy); pickup pencircle scaled 0.5pt enddef; def r_pp(expr x,y) = r_ppoint(x,y) enddef; %Placer un point creux dans ce rep�e ==================================== def r_cpoint(expr x,y) = path _e; _e = fullcircle scaled 3pt shifted(x*_ux,y*_uy); draw _e; fill _e withcolor white enddef; def r_cp(expr x,y) = r_cpoint(x,y) enddef; %Label des unit� ======================================================== def r_labelxy = pickup pencircle scaled 0.5pt; label.bot(btex $x$ etex, (_r_xmax-1mm,_oy)); label.lft(btex $y$ etex, (_ox,_r_ymax-1mm)); 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; %ou def r_seg(expr a,b,c,d) = r_p(a,b)--r_p(c,d) enddef; % Definir une droite // �l'axe des ordonn�s ============================= def rx_droite(expr k) = (k*_ux,_r_ymin)--(k*_ux,_r_ymax) enddef; % Definir une droite d�inie par un point et son coeff dir ================ def r_droitedir(expr a,b,m) = (_r_xmin,(m*_xmin+b-m*a)*_uy)--(_r_xmax,(m*_xmax+b-m*a)*_uy) enddef; def r_droite(expr a,b,m) = (_r_xmin,(m*_xmin+b-m*a)*_uy)--(_r_xmax,(m*_xmax+b-m*a)*_uy) enddef; % Projection d'un point sur les axes ====================================== def r_point_proj(expr x,y) = draw(x*_ux,_oy)--(x*_ux,y*_uy)--(_ox,_oy+y*_uy) dashed evenly; r_ppoint(x,y) enddef; def r_proj(expr x,y,couleur) = draw(x*_ux,_oy)--(x*_ux,y*_uy)--(_ox,y*_uy) dashed evenly withcolor couleur; r_ppoint(x,y) enddef; % On enl�e ce qui sort du rep�e ========================================= def r_fin = clip currentpicture to (_r_xmin-0.1*_ux,_r_ymin-0.1*_uy)--(_r_xmin-0.1*_ux,_r_ymax+0.1*_uy)-- (_r_xmax+0.1*_ux,_r_ymax+0.1*_uy)--(_r_xmax+0.1*_ux,_r_ymin-0.1*_uy)--cycle enddef; % Tracer des courbes en dimension 2 ======================================= % Sont pr��inies 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; %Aire sous une courbe : Aire(fx,fy,A,B,couleur) vardef Aire(suffix fx,fy)(expr A,B,couleur)= save a,b,c,d,p; path a,b,c,d,p; a:= f_courbe(fx,fy,A,B,50); b:=r_p(B,fy(B))--r_p(B,0); c:=r_p(B,0)--r_p(A,0); d:=r_p(A,0)--r_p(A,fy(A)); p:=buildcycle(a,b,c,d); fill p withcolor couleur; %draw f_courbe(fx,fy,-1,7,50)withpen pencircle scaled 1.5bp withcolor red; draw b withpen pencircle scaled 1.5bp; draw d withpen pencircle scaled 1.5bp; enddef; % D�iv� de f sous r�erve 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 r�ulier tel que x'(t) diff�ent 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 r�ulier tel que x'(t) diff�ent de 0===== vardef tracef_tangente(suffix fx,fy)(expr a,b,h,couleur,larg) = 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 withpen pencircle scaled larg; 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: numeric u[]; 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"; endfor; if ni=0: dotlabel.lrt(btex 0 etex,r_point(0,0)); for j=1 upto nf: dotlabel.bot(""&decimal j, r_point(j,0)); endfor; else: for j=ni upto nf: dotlabel.bot(""&decimal j, r_point(j,0)); endfor; fi; 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 pr��ent 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) withcolor bleu withpen pencircle scaled 1.8bp; 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 withpen pencircle scaled 1.4bp withcolor bleu_f; if j > i: draw r_point(u[j],u[j])--f_point(fx,fy,u[j])--r_point(u[j+1],u[j+1]) withpen pencircle scaled 1.4bp withcolor bleu_f; drawarrow r_point(u[j],u[j])--0.5( r_point(u[j],u[j])+f_point(fx,fy,u[j]))withpen pencircle scaled 1.4bp withcolor bleu_f; drawarrow f_point(fx,fy,u[j])--0.5(f_point(fx,fy,u[j])+r_point(u[j+1],u[j+1])) withpen pencircle scaled 1.4bp withcolor bleu_f; fi; endfor; draw r_point(u[i],0)--f_point(fx,fy,u[i])--r_point(u[i+1],u[i+1])withpen pencircle scaled 1.4bp withcolor bleu_f; drawarrow r_point(u[i],0)--0.5(r_point(u[i],0)+f_point(fx,fy,u[i])) withpen pencircle scaled 1.4bp withcolor bleu_f; drawarrow f_point(fx,fy,u[i])--0.5(f_point(fx,fy,u[i])+r_point(u[i+1],u[i+1])) withpen pencircle scaled 1.4bp withcolor bleu_f; 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; if t=2: for j=3 upto n: write "dotlabel.top" & "(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; %===================Hachurage (Christophe Poulain .....merci a lui)============ vardef hach(expr chemin, angle, ecart, trace,couleur)= % retourne une picture save $; picture $; path support; support=((cm*(-37,0))--(cm*(37,0))) rotated angle; if trace=1: drawoptions(dashed evenly); elseif trace=2: drawoptions(dashed dashpattern(on12bp off6bp on3bp off6bp)); fi; $=image( for j=-200 upto 200: if ((support shifted (ecart*j*(cm,0))) intersectiontimes chemin)<>(-1,-1): draw support shifted (ecart*j*(cm,0)) withcolor couleur; fi endfor; ); clip $ to chemin; drawoptions(); $ enddef; %%$==========%==================integration=================================== %Pomp�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 colori�en bleu, 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 bleu_ciel; draw p; endfor; enddef; %rectangle en dessous de la courbe colori�en bleu, utilise la macro precedente vardef trace_rectangles_min_c (suffix fx,fy)(expr a,b,inc,couleur) = 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 couleur; draw p; endfor; enddef; %rectangle en dessous de la courbe hachur� vardef trace_rectangles_min_h (suffix fx,fy)(expr a,b,inc) = save i; numeric i; for i=a step inc until b-inc: numeric m;path p; 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; hach(p,45,0.2,1,bleu_m); draw p; endfor; enddef; %rectangle en dessous de la courbe transparents, utilise la macro precedente vardef trace_rectangles_min_t (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 bleu_ciel; 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