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

Denis Girou Denis.Girou at idris.fr
Tue Jan 9 20:13:49 CET 2001


>>>>> "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.



More information about the PSTricks mailing list