Re: [NTG-context] OT: looking for metapost/fun examples
Gerben, I assume you already know about the wonderful metafun manual (http://www.pragma-ade.com/general/manuals/metafun-s.pdf). I also found this website extremely useful: http://tex.loria.fr/prod-graph/zoonekynd/metapost/metapost.html HTH Thomas On Mar 27, 2005, at 12:19 AM, Gerben Wierda wrote: I am trying to learn metapost/fun, inline in ConTeXt source. Some basic things are clear, but now the issue is metapost itself. For instance, I would like to plot a Fourier approximation of a block function. For instance, I would like to plot a gaussian spread. I am looking for examples on how to do this. I need to do a bit of programming here and these are my initial projects. Thanks in advance, G ___ ntg-context mailing list ntg-context@ntg.nl http://www.ntg.nl/mailman/listinfo/ntg-context ___ ntg-context mailing list ntg-context@ntg.nl http://www.ntg.nl/mailman/listinfo/ntg-context
Re: [NTG-context] OT: looking for metapost/fun examples
Gerben, Again, thanks for all you do. Here's a Fourier approximation of a square wave. Again, I compiled this in Texshop so I know it works. %verbatimtex % \input mtplain % \MTMI{8pt}{6pt}{5pt} % \MTSY{8pt}{6pt}{5pt} % \MTEX{8pt} % \MathRoman{tir}{8pt}{6pt}{5pt} % \MathBold{tib}{8pt}{6pt}{5pt} %etex %Input Context macros input mp-tool %define ytick vardef ytick(expr pos)= path p; p:=(-2,0)--(2,0); draw p shifted pos; enddef; %define xtick vardef xtick(expr pos)= path p; p:=(0,-2)--(0,2); draw p shifted pos; enddef; %define pi pi:=3.14159; %define cosine in radians vardef cos(expr x)= cosd(x*180/pi) enddef; %define sine in radians vardef sin(expr x)= sind(x*180/pi) enddef; %hyperbolic sine vardef sinh(expr x)= (exp(x)-exp(-x))/2 enddef; beginfig(1); %enter number of terms numeric N; N=6; %define L numeric L; L:=pi; %define a_0 ao:=1; %define a_n vardef a(expr n)= 2*sin(n*pi/2)/(n*pi) enddef; %define b_n vardef b(expr n)= 0 enddef; %initialize scale numeric ux, uy; pi*ux=2in; 1.5*uy=2in; %draw axes drawarrow (0,0)--(3.5ux,0); drawarrow (0,0)--(0,1.5uy); %label axes label.rt(btex $x$ etex, (3.5ux,0)); %tick marks xtick((pi*ux,0)); label.bot(btex $\pi$ etex, (pi*ux,0)); ytick((0,1*uy)); label.lft(btex $1$ etex, (0,1*uy)); %draw the function in black draw (0,1uy)--((pi/2)*ux,1uy); %draw Fourier approximation in cyan path p; numeric x, y; x:=0; y:=ao/2; for k=1 step 1 until N: y:=y+a(k)*cos(k*pi*x/L)+b(k)*sin(k*pi*x/L); endfor; p:=(x,y); for x=0 step .1 until pi: y:=ao/2; for k=1 step 1 until N: y:=y+a(k)*cos(k*pi*x/L)+b(k)*sin(k*pi*x/L); endfor; p:=p--(x,y); endfor; x:=pi; y:=ao/2; for k=1 step 1 until N: y:=y+a(k)*cos(k*pi*x/L)+b(k)*sin(k*pi*x/L); endfor; p:=p--(x,y); p:=p xyscaled(ux,uy); draw p withcolor cyan; endfig; beginfig(0); %enter number of terms numeric N; N=6; %define L numeric L; L:=pi; %define a_0 ao:=1; %define a_n vardef a(expr n)= 2*sin(n*pi/2)/(n*pi) enddef; %define b_n vardef b(expr n)= 0 enddef; %initialize scale numeric ux, uy; 6*pi*ux=2in; 1.5*uy=2in; %draw axes drawdblarrow (-3.5*pi*ux,0)--(3.5*pi*ux,0); drawarrow (0,0)--(0,1.5uy); %label axes label.rt(btex $x$ etex, (3.5*pi*ux,0)); %tick marks xtick((pi*ux,0)); xtick((2*pi*ux,0)); xtick((3*pi*ux,0)); label.bot(btex $3\pi$ etex, (3*pi*ux,0)); xtick((-pi*ux,0)); xtick((-2*pi*ux,0)); xtick((-3*pi*ux,0)); label.bot(btex $-3\pi$ etex, (-3*pi*ux,0)); ytick((0,1*uy)); label.lft(btex $1$ etex, (0,1*uy)); %draw the function in black path q; q:=(-pi/2,1)--(pi/2,1); q:=q xyscaled(ux,uy); draw q; draw q shifted (2*pi*ux,0); draw q shifted (-2*pi*ux,0); %draw Fourier approximation in cyan path p; numeric x, y; x:=-3*pi; y:=ao/2; for k=1 step 1 until N: y:=y+a(k)*cos(k*pi*x/L)+b(k)*sin(k*pi*x/L); endfor; p:=(x,y); for x=-3*pi step .1 until 3*pi: y:=ao/2; for k=1 step 1 until N: y:=y+a(k)*cos(k*pi*x/L)+b(k)*sin(k*pi*x/L); endfor; p:=p--(x,y); endfor; x:=3*pi; y:=ao/2; for k=1 step 1 until N: y:=y+a(k)*cos(k*pi*x/L)+b(k)*sin(k*pi*x/L); endfor; p:=p--(x,y); p:=p xyscaled(ux,uy); draw p withcolor cyan; endfig; end; On Mar 26, 2005, at 3:19 PM, Gerben Wierda wrote: I am trying to learn metapost/fun, inline in ConTeXt source. Some basic things are clear, but now the issue is metapost itself. For instance, I would like to plot a Fourier approximation of a block function. For instance, I would like to plot a gaussian spread. I am looking for examples on how to do this. I need to do a bit of programming here and these are my initial projects. Thanks in advance, G ___ ntg-context mailing list ntg-context@ntg.nl http://www.ntg.nl/mailman/listinfo/ntg-context ___ ntg-context mailing list ntg-context@ntg.nl http://www.ntg.nl/mailman/listinfo/ntg-context
Re: [NTG-context] OT: looking for metapost/fun examples
Gerben, I am so happy I can contribute as a way of thanking you for all the work that you've done for us. Thanks. Here, try this one, which uses an RK4 routine. I just tried it out in Texshop, so I know they both compile. %This file creates two figures associated with the %system x'=f(x,y), y'=g(x,y) %1. Plots the graphs of x(t) and y(t) %2. Plots the graph of (x(t),y(t)) in the phase plane. %verbatimtex %\input mtplain %etex %Generate standard eps prologues:=2; beginfig(0); %Place RHS of x'=f(t,x,y) here def fxy(expr t, x, y)= (0.4-0.01*y)*x enddef; %Place RHS of y'=g(t,x,y) here def gxy(expr t, x, y)= (-0.3+0.005*x)*y enddef; %Declare some variables path q, trajx, trajy; pair L, R, B, T, xt, yt; numeric sx[], sy[]; %Initialize clipping window a:=0; b:=40; %left and right of viewing rectangle c:=0; d:=150; %bottom and top of viewing rectangle %Initialize timespan tstart:=a; tstop:=b; %Initialize number of points to be plotted N:=500; %Calculate time increment dt for Euler's method dt:=(tstop-tstart)/N; %Scaling factors for horizontal and vertical axes. Note that this produces %an image that is 2 inches by 2 inches. (b-a)*ux=1.75in; (d-c)*uy=1.75in; %Clipping boundary q=(a,c)--(b,c)--(b,d)--(a,d)--cycle; %Use Runge-Kutta4 to create path (t,x(t)) %Choose initial condition t:=tstart; x:=40; y:=20; trajx:=(t,x); forever: sx1:=fxy(t,x,y); sy1:=gxy(t,x,y); sx2:=fxy((t+dt/2),(x+dt*sx1/2),(y+dt*sy1/2)); sy2:=gxy((t+dt/2),(x+dt*sx1/2),(y+dt*sy1/2)); sx3:=fxy((t+dt/2),(x+dt*sx2/2),(y+dt*sy2/2)); sy3:=gxy((t+dt/2),(x+dt*sx2/2),(y+dt*sy2/2)); sx4:=fxy((t+dt),(x+dt*sx3),(y+dt*sy3)); sy4:=gxy((t+dt),(x+dt*sx3),(y+dt*sy3)); x:=x+dt*(sx1+2*sx2+2*sx3+sx4)/6; y:=y+dt*(sy1+2*sy2+2*sy3+sy4)/6; t:=t+dt; trajx:=trajx..(t,x); exitif ((t>tstop) or (t>b) or (xd)); endfor; %Use Runge-Kutta4 to create path (t,y(t)) %Choose initial condition t:=tstart; x:=40; y:=20; trajy:=(t,y); forever: sx1:=fxy(t,x,y); sy1:=gxy(t,x,y); sx2:=fxy((t+dt/2),(x+dt*sx1/2),(y+dt*sy1/2)); sy2:=gxy((t+dt/2),(x+dt*sx1/2),(y+dt*sy1/2)); sx3:=fxy((t+dt/2),(x+dt*sx2/2),(y+dt*sy2/2)); sy3:=gxy((t+dt/2),(x+dt*sx2/2),(y+dt*sy2/2)); sx4:=fxy((t+dt),(x+dt*sx3),(y+dt*sy3)); sy4:=gxy((t+dt),(x+dt*sx3),(y+dt*sy3)); x:=x+dt*(sx1+2*sx2+2*sx3+sx4)/6; y:=y+dt*(sy1+2*sy2+2*sy3+sy4)/6; t:=t+dt; trajy:=trajy..(t,y); exitif ((t>tstop) or (t>b) or (yd)); endfor; %Draw the paths x(t) and y(t) and clip them to bounding box draw trajx xscaled ux yscaled uy withcolor red; draw trajy xscaled ux yscaled uy withcolor red dashed evenly; clip currentpicture to (q xscaled ux yscaled uy); %Label graph x(t) and initial condition len:= 0.65*(length trajx); xt:=point len of trajx; label.urt(btex $\scriptstyle x(t)$ etex, (xt xscaled ux yscaled uy)); %Label graph y(t) and initial condition len:= 0.5*(length trajy); yt:=point len of trajy; label.lrt(btex $\scriptstyle y(t)$ etex, (yt xscaled ux yscaled uy)); %Initialize left and right endpoints on time-axis L=(a*ux,0);R=(b*ux,0); %Draw and label t-axis drawarrow L--R; label.rt(btex $\scriptstyle t$ etex,(b*ux,0)); %Initialize bottom and top endpoints on time-axis B=(0,c*uy);T=(0,d*uy); %Draw and label vertical axis drawarrow B--T; label.lft(btex $\scriptstyle 0$ etex, B); label.lft(btex $\scriptstyle 150$ etex, T); endfig; beginfig(2); %Make some variables local save ux, uy; %Place RHS of x'=f(t,x,y) here def fxy(expr t, x, y)= (0.4-0.01*y)*x enddef; %Place RHS of y'=g(t,x,y) here def gxy(expr t, x, y)= (-0.3+0.005*x)*y enddef; %Declare some variables path q, trajxy; pair L, R, B, T; %Initialize clipping window a:=0; b:=150; %left and right of viewing rectangle c:=0; d:=100; %bottom and top of viewing rectangle %Initialize timespan tstart:=a; tstop:=b; %Initialize number of points to be plotted N:=500; %Calculate time increment dt for Euler's method dt:=(tstop-tstart)/N; %Scaling factors for horizontal and vertical axes. Note that this produces %an image that is 2 inches by 2 inches. (b-a)*ux=1.75in; (d-c)*uy=1.75in; %Clipping boundary q=(a,c)--(b,c)--(b,d)--(a,d)--cycle; %Use Runge-Kutta4 to create path (x(t),y(t)) %Choose initial condition t:=tstart; x:=40; y:=20; trajxy:=(x,y); forever: sx1:=fxy(t,x,y); sy1:=gxy(t,x,y); sx2:=fxy((t+dt/2),(x+dt*sx1/2),(y+dt*sy1/2)); sy2:=gxy((t+dt/2),(x+dt*sx1/2),(y+dt*sy1/2)); sx3:=fxy((t+dt/2),(x+dt*sx2/2),(y+dt*sy2/2)); sy3:=gxy((t+dt/2),(x+dt*sx2/2),(y+dt*sy2/2)); sx4:=fxy((t+dt),(x+dt*sx3),(y+dt*sy3)); sy4:=gxy((t+dt),(x+dt*sx3),(y+dt*sy3)); x:=x+dt*(sx1+2*sx2+2*sx3+sx4)/6; y:=y+dt*(sy1+2*sy2+2*sy3+sy4)/6; t:=t+dt; trajxy:=trajxy..(x,y); exitif ((t>tstop) or (t>b) or (xb) or (yd)); endfor; %Draw the paths x(t) and y(t) and clip them to bounding box draw trajxy xscaled ux yscaled uy withcolor red; clip currentpicture to (q xscaled ux yscaled uy); %Initialize left and right endpoints on x-axis L=(a*ux,0);R=(b*ux,0); %Draw and label x-axi
[NTG-context] OT: looking for metapost/fun examples
I am trying to learn metapost/fun, inline in ConTeXt source. Some basic things are clear, but now the issue is metapost itself. For instance, I would like to plot a Fourier approximation of a block function. For instance, I would like to plot a gaussian spread. I am looking for examples on how to do this. I need to do a bit of programming here and these are my initial projects. Thanks in advance, G ___ ntg-context mailing list ntg-context@ntg.nl http://www.ntg.nl/mailman/listinfo/ntg-context