14

How can I use the pgf maths engine to plot the integral of any function?

For example \addplot {int(cos(x))} does not work.

5
  • 5
    Wow, TeX doing integrals... That is ambitious. Though, if you mean numerical, not symbolic (as your question seems to suggest), it is probably pretty doable. (Theoretically, symbolic is of course doable as well - but not worth the effort imho.)
    – mbork
    Commented Mar 21, 2013 at 7:32
  • 2
    I don't think the pgf math engine was designed for this. You could use an external program to carry out computations like this.
    – user10274
    Commented Mar 21, 2013 at 7:36
  • Or luatex, though it might be reinventing the wheel...
    – mbork
    Commented Mar 21, 2013 at 7:44
  • 2
    Numerical integration (e.g. trapezoid or Simpson's rule) can be done easily enough with a for loop starting by \pgfplotsforeachungrouped. Symbolic integration, though, is a different problem altogether.
    – jub0bs
    Commented Mar 21, 2013 at 7:48
  • I decided the simplest would be to calculate the symbolic integration on wolframalpha.com Thanks all.
    – skvery
    Commented Mar 29, 2013 at 13:01

2 Answers 2

14

As was said in the comments, you PGF can't compute the antiderivative analytically. If the function is reasonably linear, you can quite easily compute the antiderivative numerically, similar to the approach in Get derivative of a function.

Here's an approach using PGFPlotstable to calculate the function values:

\documentclass[border=5mm]{article}
\usepackage{pgfplots, pgfplotstable}

\pgfplotstablenew[
    create on use/x/.style={
        create col/expr={\pgfplotstablerow/50}
    },
    create on use/y/.style={
        create col/expr={cos(deg(\thisrow{x}))}
    },
    create on use/int/.style={
        create col/expr={\pgfmathaccuma+(\thisrow{y}+\prevrow{y})/2*(\thisrow{x}-\prevrow{x})}
    },
    columns={x,y,int}
]
{200}
\datatableA

\begin{document}
\begin{tikzpicture}[trim axis left]
\begin{axis}[no markers, legend style={at={(0.5,-0.20)}, anchor=north}, legend entries={Original function, Analytical antiderivative, Numerical antiderivative}]
\addplot [gray] table {\datatableA};
\addplot [line width=3pt, red!50, domain=0:4] {sin(deg(x))};
\addplot [black] table [y=int] {\datatableA};
\end{axis}
\end{tikzpicture}\\[3ex]

\pgfplotstablenew[
    create on use/x/.style={
        create col/expr={\pgfplotstablerow/50-2}
    },
    create on use/y/.style={
        create col/expr={\thisrow{x}^3}
    },
    create on use/int/.style={
        create col/expr={\pgfmathaccuma+(\thisrow{y}+\prevrow{y})/2*(\thisrow{x}-\prevrow{x})}
    },
    columns={x,y,int}
]
{200}
\datatableB


\begin{tikzpicture}[trim axis left]
\begin{axis}[no markers, samples=500]
\addplot [gray] table {\datatableB};
\addplot [line width=3pt, red!50, domain=-2:2] {1/4*x^4};
\addplot [black] table [y expr=\thisrow{int}-4] {\datatableB};
\end{axis}
\end{tikzpicture}

\end{document}
5
  • Very nice. Would it be possible to hide it all inside a style, say \addplot[int] {cos(deg(x))}; (that is automatic definition of the function to be used in the table and \addplot table behind the scene)?
    – cjorssen
    Commented Mar 21, 2013 at 8:50
  • @cjorssen: That should be possible, but it would take a bit of work...
    – Jake
    Commented Mar 21, 2013 at 10:20
  • Then I guess I should start a bounty to reward that bit of work :)
    – cjorssen
    Commented Mar 21, 2013 at 12:13
  • 2
    @cjorssen: That seems like an abuse of the plot style. IMO the style of a plot shouldn't change the function. But you could hack into pgfmath so that it could parse something like int(cos(deg(x)),x,0,1). Commented Mar 21, 2013 at 12:28
  • @MatthewLeingang Here is a feature request for this: sourceforge.net/p/pgf/feature-requests/99
    – student
    Commented Jun 21, 2016 at 11:27
12

PSTricks can do it. Here is an example for the default Simpson method (Integral of sin(x)+cos(x):

\documentclass[pstricks,border=15pt]{standalone}
\usepackage{pst-func}

\begin{document}

 \begin{pspicture}[linewidth=1pt](-1,-1.5)(7,2.5)
 \psaxes{->}(0,0)(-1,-1.2)(6.75,2.5)
 \psplot[linecolor=red,algebraic]{0}{6.5}{cos(x)+sin(x)}
 \psCumIntegral[plotpoints=500,Simpson=10,
   linecolor=blue]{0}{6.5}{ RadtoDeg dup cos exch sin add }
 \end{pspicture}

\end{document}

Run it with xelatex. pst-func also knows \psIntegral, see documentation.

enter image description here

1
  • Could you make an answer for this question as well? I have no idea because of 2 variables. Commented Aug 23, 2013 at 14:51

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .