text: # Computing $\pi$ with Interpolation¶
  
  In [9]:
  import numpy as np
  import numpy.linalg as la
  import matplotlib.pyplot as plt
  
  
  Here's the half-circle function:
  
  In [14]:
  def f(x):
  return np.sqrt(1-x**2)
  
  
  We'll only look at it on $[0,1]$:
  
  In [15]:
  x_plot = np.linspace(0, 1, 1000)
  plt.plot(x_plot, f(x_plot))
  
  Out[15]:
  [<matplotlib.lines.Line2D at 0x7fe57c7b6be0>]
  In [84]:
  degree = 4
  
  nodes = np.linspace(0, 1, degree+1)
  nodes
  
  Out[84]:
  array([ 0.  ,  0.25,  0.5 ,  0.75,  1.  ])
  
  Now build the Vandermonde matrix:
  
  In [85]:
  V = np.array([
  nodes**i
  for i in range(degree+1)
  ]).T
  
  
  And find the coefficients as coeffs:
  
  In [86]:
  coeffs = la.solve(V, f(nodes))
  
  
  Now evaluate the interpolant at x_plot
  
  In [87]:
  interp_plot = 0*x_plot
  for i in range(degree+1):
  interp_plot += coeffs[i] * x_plot**i
  
  plt.plot(x_plot, interp_plot)
  plt.plot(x_plot, f(x_plot))
  plt.plot(nodes, f(nodes), "o")
  
  Out[87]:
  [<matplotlib.lines.Line2D at 0x7fe5770c2c88>]
  
  Now integrate the interpolant:
  
  In [88]:
  # clear
  integral = 0
  for i in range(degree+1):
  integral += coeffs[i] * 1/(i+1) * (1**(i+1) - 0**(i+1))
  
  In [89]:
  my_pi = 4*integral
  my_pi
  
  Out[89]:
  3.0907636490484132
  In [ ]: