pythonfunctionmathnumerical-integrationquad

How to use `scipy.integrate.quad` to compute integral of a function which depends on the integral of another function


Any help to compute this integration, F function is defined using the f function which involves the first integration, finally, integrate F.

from scipy.integrate import quad

f = lambda x,a : a**2*x

def F(s,a):
  return quad(f,0,s,args=(a,))
quad(F,0,5,args=(4,))

Got the error:

      2 def F(s,a):
      3   return quad(f,0,s,args=(a,))
----> 4 quad(F,0,5,args=(4,))
      5 
    446     if points is None:
    447         if infbounds == 0:
--> 448             return _quadpack._qagse(func,a,b,args,full_output,epsabs,epsrel,limit)
    449         else:
    450             return _quadpack._qagie(func,bound,infbounds,args,full_output,epsabs,epsrel,limit)

TypeError: must be real number, not tuple

Solution

  • Have a look at the return values of scipy.integrate.quad:

    Returns:

    y: float The integral of func from a to b.

    abserr: float An estimate of the absolute error in the result.

    ...

    So there are multiple return values (a tuple) and that's why you're getting the TypeError: must be real number, not tuple message.

    I guess, you're just interested in the integral value quad(...)[0] so that's what your F should return:

    from scipy.integrate import quad
    
    f = lambda x, a: a**2 * x
    F = lambda x, a: quad(f, 0, x, args=(a,))[0]
    
    I = quad(F, 0, 5, args=(4,))
    print(I)
    

    Which prints:

    (333.33333333333337, 3.700743415417189e-12)