# [SciPy-User] integrals and quad

josef.pktd@gmai... josef.pktd@gmai...
Wed Aug 15 15:20:37 CDT 2012

On Wed, Aug 15, 2012 at 4:15 PM, nicky van foreest <vanforeest@gmail.com> wrote:
> Hi,
>
> Given some function f it is easy with scipy.integrate.quad to compute
> the integral of f for some given endpoint. However, I need the
> integral at many endpoints, that is, I want to plot \int_0^t f(x) dx.
> How can this be done in an efficient and elegant way?
>
> To illustrate I used the following code.
>
> from numpy import cumsum, linspace, vectorize
> from scipy.integrate import quad
> from  pylab import plot, show
>
> def f(x):
>     return x
>
> F = vectorize(lambda t: quad(f, 0, t)[0]) # must be wasteful
>
>
> t = linspace(0,3, 50)
>
> FF = cumsum(f(t))*(t[1]-t[0])  # simple, but inaccurate, note that
> t[1]-t[0] is the grid size, a bit like dx in the integral
>
> plot(t,f(t))
> plot(t, F(t))
> plot(t, F)
> show()
>
> I suspect that calling F at many values is wasteful, since the
> integral is evaluated at the same points many times. The trick with
> using cumsum must save some work (an O(n) algo), but is less accurate
> as is shown by the graphs. So, I don't like to use cumsum, and I also
> don't like to use a vectorized quad. Is there something better?

cumtrapz is the only one that works (when I looked at this)
I also tried odeint for this once before, but didn't really use it.

Josef

>
> thanks
>
> Nicky
> _______________________________________________
> SciPy-User mailing list
> SciPy-User@scipy.org
> http://mail.scipy.org/mailman/listinfo/scipy-user