Integration Exercise 2


In [6]:
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from scipy import integrate

Indefinite integrals

Here is a table of definite integrals. Many of these integrals has a number of parameters $a$, $b$, etc.

Find five of these integrals and perform the following steps:

  1. Typeset the integral using LateX in a Markdown cell.
  2. Define an integrand function that computes the value of the integrand.
  3. Define an integral_approx funciton that uses scipy.integrate.quad to peform the integral.
  4. Define an integral_exact function that computes the exact value of the integral.
  5. Call and print the return value of integral_approx and integral_exact for one set of parameters.

Here is an example to show what your solutions should look like:


Here is the integral I am performing:

$$ I_1 = \int_0^\infty \frac{dx}{x^2 + a^2} = \frac{\pi}{2a} $$

In [7]:
def integrand(x, a):
    return 1.0/(x**2 + a**2)

def integral_approx(a):
    # Use the args keyword argument to feed extra arguments to your integrand
    I, e = integrate.quad(integrand, 0, np.inf, args=(a,))
    return I

def integral_exact(a):
    return 0.5*np.pi/a

print("Numerical: ", integral_approx(1.0))
print("Exact    : ", integral_exact(1.0))

Numerical:  1.5707963267948966
Exact    :  1.5707963267948966

In [8]:
assert True # leave this cell to grade the above integral

Integral 1

$I_{1} = \int_{0}^{\infty}\frac{x}{\sinh ax}dx = \frac{\pi^2}{4a^2}$

In [9]:
def integrand1(x,a):
    return x/np.sinh(a*x)
def integral_approx1(a):
    I1,e1 = integrate.quad(integrand1,0,np.inf,args = (a,))
    return I1
def integral_exact1(a):
    return np.pi ** 2/(4*a**2)
print("Numerical: ", integral_approx1(1.0))
print("Exact    : ", integral_exact1(1.0))

Numerical:  2.467401100272339
Exact    :  2.4674011002723395

In [10]:
assert True # leave this cell to grade the above integral

Integral 2

$\int_{0}^{1}\frac{\ln(1+x)}{x}dx = \frac{\pi^2}{12}$

In [11]:
def integrand2(x,a):
    return np.log(1+x)/x
def integral_approx2(a):
    I2,e2 = integrate.quad(integrand2,0,1,args = (a,))
    return I2
def integral_exact2(a):
    return np.pi**2/12
print("Numerical: ", integral_approx2(1.0))
print("Exact    : ", integral_exact2(1.0))

Numerical:  0.8224670334241132
Exact    :  0.8224670334241132

In [12]:
assert True # leave this cell to grade the above integral

Integral 3

$\int_{0}^{a}\sqrt {a^2-x^2}dx = \frac{\pi a^2}{4}$

In [13]:
def integrand3(x,a):
    return np.sqrt(a**2-x**2)
def integral_approx3(a):
    I3,e3 = integrate.quad(integrand3,0,a,args = (a,))
    return I3
def integral_exact3(a):
    return np.pi * a**2/4
print("Numerical: ", integral_approx3(1.0))
print("Exact    : ", integral_exact3(1.0))

Numerical:  0.7853981633974481
Exact    :  0.7853981633974483

In [14]:
assert True # leave this cell to grade the above integral

Integral 4

$\int_{0}^{\infty}\frac{\sin^2px}{x^2}dx = \frac{\pi p}{2}$

In [15]:
def integrand4(x,a):
    return (np.sin(a*x))**2/x**2
def integral_approx4(a):
    I4,e4 = integrate.quad(integrand4,0,np.inf,args = (a,))
    return I4
def integral_exact4(a):
    return np.pi*a/2
print("Numerical: ", integral_approx4(1.0))
print("Exact    : ", integral_exact4(1.0))

Numerical:  1.5708678849453777
Exact    :  1.5707963267948966
/usr/local/lib/python3.4/dist-packages/scipy/integrate/ IntegrationWarning: The maximum number of subdivisions (50) has been achieved.
  If increasing the limit yields no improvement it is advised to analyze 
  the integrand in order to determine the difficulties.  If the position of a 
  local difficulty can be determined (singularity, discontinuity) one will 
  probably gain from splitting up the interval and calling the integrator 
  on the subranges.  Perhaps a special-purpose integrator should be used.
  warnings.warn(msg, IntegrationWarning)

In [16]:
assert True # leave this cell to grade the above integral

Integral 5

$\int_{0}^{\infty}\frac{1-\cos px}{x^2} = \frac{\pi p}{2}$

In [17]:
def integrand5(x,a):
    return (1-np.cos(a*x))/x**2
def integral_approx5(a):
    I5,e5 = integrate.quad(integrand5,0,np.inf,args = (a,))
    return I5
def integral_exact5(a):
    return np.pi *a/2
print("Numerical: ", integral_approx5(1.0))
print("Exact    : ", integral_exact5(1.0))

Numerical:  1.5709620201480032
Exact    :  1.5707963267948966

In [18]:
assert True # leave this cell to grade the above integral