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
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 (x
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
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
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
participants (3)
-
David Arnold
-
Gerben Wierda
-
Thomas A.Schmitz