18

Using the question here I have tried to plot a piecewise function. My code looks like

\begin{document}
\pgfmathdeclarefunction{func}{1}{%    
\pgfmathparse{%
(and(#1<=-2)  * (#1*#1 + #1*6 + 8)   +%     
(and(#1>=-2  ,#1<=1) * (2 - #1 - #1*#1)   +%    
(and(#1>=1  ,#1<=2) * (6 - #1*8 + #1*#1*2)   +%
(and(#1>=2) * (-10 + #1*6 - #1*#1)   %
}%
}


\begin{tikzpicture}[scale=0.8    
\begin{axis}[
axis x line=middle, 
axis y line=middle, 
ymin=-5, ymax=5, ytick={-1,-2,-3,-4,-5,1,2,3,4,5}, ylabel=$y$, 
xmin=-5, xmax=5, xtick={-5,-4,-3,-2,-1,1,2,3,4,5}, xlabel=$x$
]

\addplot[blue,domain=-5:5]{func(x)};
\end{axis}
\end{tikzpicture} 

\end{document}

The function will be x^2+6x+8 for x<=-2, 2-x-x^2 for -2<=x<=1, 2x^2-8x+6 for 1<=x<=2, and -x^2+6x-10 for x>=2. When I try to compile it gives me a PGF Math Error: internal routine of the floating point. How do I fix this?

0

2 Answers 2

35

The and function has at least two arguments, otherwise it can’t and anything. Simply remove the ands from the first and the last term.

You should also make sure that the pieces do not overlap which they do in your case as you always use <= and >= on the same border value.

Furthermore, I have used the top-level declare function key to declare a function.

Code

\documentclass[tikz]{standalone}
\usepackage{pgfplots}
%\pgfplotsset{compat=1.8}
\begin{document}
\begin{tikzpicture}[
  declare function={
    func(\x)= (\x<=-2) * (\x*\x + 6*\x + 8)   +
     and(\x>-2, \x<=1) * (2 - \x - \x*\x)     +
     and(\x>1,  \x<=2) * (6 - 8*\x + 2*\x*\x) +
                (\x>2) * (-10 + 6*\x - \x*\x);
  }
]
\begin{axis}[
  axis x line=middle, axis y line=middle,
  ymin=-5, ymax=5, ytick={-5,...,5}, ylabel=$y$,
  xmin=-5, xmax=5, xtick={-5,...,5}, xlabel=$x$,
]
\pgfplotsinvokeforeach{-2, 1, 2}{
  \draw[dashed] ({rel axis cs: 0,0} -| {axis cs: #1, 0}) -- ({rel axis cs: 0,1} -| {axis cs: #1, 0});}
\addplot[blue, domain=-5:5, smooth]{func(x)};
\end{axis}
\end{tikzpicture} 
\end{document}

Output

enter image description here

1
  • 1
    Hi, could I ask you how to make this function parametric ? (parameters instead of 6 and 8)
    – dario
    Jan 22, 2017 at 23:15
2

It's for an alternative with Asymptote.

enter image description here

// http://asymptote.ualberta.ca/
// ploting a piecewise function
import graph;
unitsize(1cm);
real f(real x){
if (x<=-2) 
  return (x^2 + 6x + 8);
else if (x>-2 && x<=1) 
  return (2-x-x^2);
else if (x>1 && x<=2) 
  return (6 - 8x + 2x^2);
else 
  return (-10+6x-x^2);
}

guide gf=graph(f,-5,4.2);
draw(gf,red+1pt);
xaxis(Label("$x$",align=NE),-4.9,4.9,LeftTicks(Step=1,NoZero),Arrow(TeXHead));
yaxis(Label("$y$",align=E),-2.5,2.5,RightTicks(Step=1,NoZero),Arrow(TeXHead));
//axes("$x$","$y$",Arrow);

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.