File:  [LON-CAPA] / loncom / html / adm / help / tex / Authoring_Piecewise_Plot.tex
Revision 1.1: download - view: text, annotated - select for diffs
Fri Jul 26 19:53:59 2002 UTC (21 years, 11 months ago) by bowersj2
Branches: MAIN
CVS tags: version_0_5_1, version_0_5, HEAD
.tex files from help.loncapa.org largely done. Added some lables to
older files. Last mega-massive .tex commit for a while.

\label{Authoring_Piecewise_Plot}
Suppose you want to plot a piecewise function similar to the
following:

\begin{verbatim}
f(x) = a*x + b if (x < 4.5)
f(x) = a*x     if (x >=4.5)
\end{verbatim}

The following is the XML representation of a problem with a dynamic
plot based on this. The work is done in a <script> block that
generates the data sets used in the plot.

\begin{verbatim}
 <script type="loncapa/perl" >
 $a = &random(2,5,1);
 $b = &random(3,6,1);
 
 for ($x = 0; $x<4.5; $x+= 0.05) {
     push @X, $x;
     push @Y, $a*$x + $b;
 }
 
 for ($x = 4.5; $x<=10; $x+= 0.05) {
     push @X, $x;
     push @Y, $a*$x;
 }
 </script >
 <gnuplot font="medium" width="500" grid="on" height="400" border="on" 
          fgcolor="x000000" alttag="dynamically generated plot" align="center" 
          bgcolor="xffffff" transparent="off" >
     <curve linestyle="lines" pointsize="1" pointtype="1" color="x000000" 
      name="">
         <data >@X</data >
         <data >@Y</data >
     </curve >
 </gnuplot >
\end{verbatim}

The above script works, but it produces a plot like this:

\includegraphics{dynamic_piecewise}

A better solution is to use two seperate <curve> statements to plot
two separate curves. So on the second piece of the function we use
@X2 and @Y2 instead of @X and @Y. Then in the <gnuplot> tag we
include a second <curve> sub-tag.

\begin{verbatim}
 <script type="loncapa/perl" >
 $a = &random(2,5,1);
 $b = &random(3,6,1);
 
 for ($x = 0; $x<4.5; $x+= 0.05) {
     push @X, $x;
     push @Y, $a*$x + $b;
 }
 
 for ($x = 4.5; $x<=10; $x+= 0.05) {
     push @X2, $x;
     push @Y2, $a*$x;
 }
 </script >
 <gnuplot font="medium" width="500" grid="on" height="400" border="on" 
          fgcolor="x000000" alttag="dynamically generated plot" align="center" 
          bgcolor="xffffff" transparent="off" >
     <curve linestyle="lines" pointsize="1" pointtype="1" color="x000000" 
      name="" >
         <data >@X</data >
         <data >@Y</data >
     </curve >
     <curve linestyle="lines" pointsize="1" pointtype="1" color="x000000" 
      name="" >
         <data >@X2</data >
         <data >@Y2</data >
     </curve >
 </gnuplot >
\end{verbatim}

\includegraphics{dynamic_piecewise2}

This is still not a desirable result. Typically one wants an open
circle or closed circle defining the domain of each
piece. Unfortunately there is no easy way to do this in gnuplot
currently. If this effect is desired, perhaps using a static image
and a randomlabel problem would be a better approach. A second
solution would be to add data which draws a circle to your curves.

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>