[pstricks] Making Direction Fields; also coordinates as functions inside loops

Michael J. Sharpe msharpe at euclid.ucsd.edu
Wed Jan 10 00:41:12 CET 2001


At 8:13 PM +0100 1/9/01, Denis Girou wrote:
>  >>>>> "Michael.Dougherty" == Michael M Dougherty, Ph D 
><doughem at swosu.edu> writes:
>
>     Michael.Dougherty> I would like to plot a direction field for some simple
>     Michael.Dougherty> ordinary differential equations without plotting the
>     Michael.Dougherty> vectors or line segments each individually.  In other
>     Michael.Dougherty> words I would like to use loops, perhaps to make
>     Michael.Dougherty> a vector or line segment at/through each 
>point with integer
>     Michael.Dougherty> coordinates.  For instance, I would like to plot
>     Michael.Dougherty> a field for $dy/dx=-x/y$ (and later plot some circles
>     Michael.Dougherty> which are the solution curves--that I can do).  I would
>     Michael.Dougherty> like the method to be more general than for 
>just this one, but
>     Michael.Dougherty> hopefully this one will suffice to start. 
>
>     Michael.Dougherty> Therefore I need the coordinates of the line 
>segments/vectors
>     Michael.Dougherty> to be functions of $x$ and $y$.  I was hoping 
>to use multido
>     Michael.Dougherty> but I do not know how to calculate the coordinates of
>     Michael.Dougherty> the endpoints of the line segments or vectors 
>within the loop.
>     Michael.Dougherty> This is my first attempt at multido, but I do 
>understand how
>     Michael.Dougherty> to plot functions (so I know about RPN). 
>Here's the code
>     Michael.Dougherty> I'm looking at:
>
>     Michael.Dougherty> \begin{pspicture}(-6,-5)(6,5)
>     Michael.Dougherty> \psaxes{<->}(0,0)(-6,-5)(6,5)
>     Michael.Dougherty> \multido{\n=-5+1}{11}{%
>     Michael.Dougherty>  \multido{\N=-5+1}{11}{%
>     Michael.Dougherty> %%%%%%%  WHAT TO PUT HERE?
>     Michael.Dougherty> %%%%%%% 
>Want\psline((\n-1/(2\sqrt{1+x^2/y^2}),\N-x/(2*y\sqrt{1+%
>     Michael.Dougherty> %%%%%%% 
>x^2/y^2})),((n+1/(2\sqrt{1+x^2/y^2}),\N+x/(2*y\sqrt{1+%
>     Michael.Dougherty> %%%%%%%  x^2/y^2})). 
>     Michael.Dougherty> }}
>     Michael.Dougherty> \end{pspicture}
>
>   Another solution than the one posted by Michael Sharpe is to use a \psline
>macro with PostScript coordinates (see the documentation page 72, (!ps)
>paragraph). I use the formula given by Michael Dougherty.
>
>   Probably that this solution would be easier to understand, because it
>require less PostScript management as the drawing of the vectors is done by
>a PSTricks macro, which avoid to use the translate, rlineto, etc. PostScript
>macros. Nevertheless, probably that the solution of Michael is more powerful
>and flexible, as it seems easier to change the definition of the vectors.
>If you experience more on this field, tell us the results of your work...
>
>   P.S. for Michael Dougherty: comparing to the version I sent you yesterday,
>this one is a little more complicated with a conditional in the PostScript
>code, because I manage this time the cases where \ia or \ib is equal to 0.
>
>\documentclass[a4paper]{article}
>
>\usepackage{pst-plot}
>
>\pagestyle{empty}
>
>\begin{document}
>
>\SpecialCoor
>
>\begin{pspicture}(-6,-6)(6,6)
>   \psaxes{<->}(0,0)(-6,-6)(6,6)
>   \psset{arrows=->}
>   \multido{\ia=-5+1}{11}{%
>     \multido{\ib=-5+1}{11}{%
>       \pstVerb{/x \ia\space def
>                /y \ib\space def
>                y 0 eq
>                  {/ValueTempA 0 def
>                   /ValueTempB 0.5 def}
>                  {/ValueTempZ 2 1 x x mul y y mul div add sqrt mul def
>                   /ValueTempA 1 ValueTempZ div def
>                   /ValueTempB x y ValueTempZ mul div def}
>                  ifelse}
>       \psline(! x ValueTempA sub y ValueTempB sub)
>              (! x ValueTempA add y ValueTempB add)}}
>\end{pspicture}
>
>\begin{pspicture}(-6,-6)(6,6)
>   \psaxes{<->}(0,0)(-6,-6)(6,6)
>   \psset{arrows=->}
>   \multido{\ia=-5+1}{11}{%
>     \multido{\ib=-5+1}{11}{%
>       \pstVerb{/x \ia\space def
>                /y \ib\space def
>                y 0 eq
>                  {/ValueTempA 0 def
>                   /ValueTempB 0.5 def}
>                  {/ValueTempZ 2 1 x x mul y y mul div add sqrt mul def
>                   /ValueTempA 1 ValueTempZ div def
>                   /ValueTempB x neg y ValueTempZ mul div def}
>                  ifelse}
>       \psline(! x ValueTempA sub y ValueTempB sub)
>              (! x ValueTempA add y ValueTempB add)}}
>\end{pspicture}
>
>% From Michael Sharpe
>
>\def\transl#1#2{%
>#1\space 72 2.54 div mul #2\space 72 2.54 div mul translate 0 0 moveto}
>
>\newif\ifnotbothz
>
>\begin{pspicture}(-6,-6)(6,6)
>   \psaxes{<->}(0,0)(-6,-6)(6,6)
>   \multido{\n=-5+1}{11}{%
>     \multido{\N=-5+1}{11}{%
>       \notbothztrue
>       \ifnum\N=0
>         \ifnum\n=0
>           \notbothzfalse
>         \fi
>       \fi
>       \ifnotbothz
>         \psdot(0,0)
>         \pstverb{\transl{\n}{\N}\space
>                  %next line gives a direction vector (y=\n,x=\N)
>                  \n\space \N\space
>                  atan rotate -9 0 moveto 18 0 rlineto stroke}
>       \fi}}
>\end{pspicture}
>
>\begin{pspicture}(-6,-6)(6,6)
>   \psaxes{<->}(0,0)(-6,-6)(6,6)
>   \multido{\n=-5+1}{11}{%
>     \multido{\N=-5+1}{11}{%
>       \notbothztrue
>       \ifnum\N=0
>         \ifnum\n=0
>           \notbothzfalse
>         \fi
>       \fi
>       \ifnotbothz
>         \psdot(0,0)
>         \pstverb{\transl{\n}{\N}\space
>                  %next line gives a direction vector (y=-\n,x=\N)
>                  \n\space neg \N\space
>                  atan rotate -9 0 moveto 18 0 rlineto stroke}
>       \fi}}
>\end{pspicture}
>
>\end{document}
>
>D.G.
>_______________________________________________

Here's another way making use of the ability of \SpecialCoor pointed 
out by Denis to do the picture using \pstcustom.

%&Plain
\input pstricks
\input pst-plot
\def\drawseg#1#2{\pscustom{%
\translate(#1,#2)
\rotate{(-#2,#1)}%vector in direction of field at x=#1,y=#2
\psline(-.25,0)(.25,0)
}}
Direction field example ($y'=-x/y$).

\vglue2pc
\SpecialCoor

\pspicture(-6,-6)(6,6)
\psaxes{<->}(0,0)(-6,-6)(6,6)
\multido{\n=-5+1}{11}{%
\multido{\N=-5+1}{11}{%
\ifnum\N=0 %
\ifnum\n=0 \else\drawseg{\n}{\N}
\fi
\else\drawseg{\n}{\N}\fi
}
}

\endpspicture
\end




More information about the PSTricks mailing list