Lagrange Interpolation Implementation In Python

Lagrange Interpolation

Mathematical Background

This technique is useful for un-equspaced data points and if you’ve taken a course in Numerical Analysis you probably are familiar with this technique among other interpolation methods like the

• Netwon’s Forward Difference Interpolating Polynomial and
• Netwon’s Backward Difference Interpolating Polynomial

It allows us to find values of unseen data points based on existing data,value pairs

From the definition of gradient, we take three points $$(x,f(x)), (x_{0},f(x_{0})) , (x_{1},f(x_{1}))$$

x $$x_{0}$$ $$x_{1}$$
$$f(x)$$ $$f(x_{0})$$ $$f(x_{1})$$

To find the gradient of a function we use,

$\frac{ \delta y}{ \delta x} = \frac{f(x) - f(x_{0})}{x - x_{0}} = \frac{f(x_{0}) - f(x_{1})}{x_{0} - x_{1}}$

Let us solve for $$f(x)$$.

Solution

By cross multiplication we have,

$(f(x) - f(x_{0}))(x_{0} - x_{1}) = (f(x_{0}) - f(x_{1}))(x - x_{0})$

Expanding the Multiplication on both sides,

$x_{0}f(x) - x_{0}f(x_{0}) - x_{1}f(x) + x_{1}f(x_{0}) = xf(x_{0}) - xf(x_{1}) - x_{0}f(x_{0}) + x_{0}f(x_{1})$

Removing the common term $$x_{0}f(x_{0})$$ from both sides we have:

$x_{0}f(x) - x_{1}f(x) + x_{1}f(x_{0}) = xf(x_{0}) - xf(x_{1}) + x_{0}f(x_{1})$

Grouping terms of $$f(x)$$ on one side we have:

$x_{0}f(x) - x_{1}f(x) = xf(x_{0}) - xf(x_{1}) + x_{0}f(x_{1}) - x_{1}f(x_{0})$

Reducing the equation to

$(x_{0} - x_{1})f(x) = (x - x_{1})f(x_{0}) + (x_{0} - x)f(x_{1})$

solving for $$f(x)$$ by dividing both sides by $$(x_{0} - x_{1})$$ we obtain:

$$f(x) = \frac{(x - x_{1})f(x_{0}) + (x_{0} - x)f(x_{1})}{x_{0} - x_{1}}$$ or

$f(x) = \frac{x - x_{1}}{x_{0} - x_{1}}f(x_{0}) +\frac{x_{0} - x}{x_{0} - x_{1}}f(x_{1})$

Example

Writing a Python Script to Solve this problem.

I wrote a program in python that takes $$x_{0},x_{1},x,f(x_{0}) and f(x_{1})$$ values and returns the result, $$f(x)$$ after performing lagrange interpolation using the data.

#!python
#lagrange.py x0, x1, f(x0), f(x1) X
from argparse import ArgumentParser

def foX(X,x0=0,x1=0,f_x0=0,f_x1=0):
x0_x1=x0-x1
x0_X=x0-X
X_x1=X-x1
f_x1=f_x1
f_x0=f_x0
f_X=( (x0_X*f_x1)/x0_x1 ) + ( (X_x1*f_x0)/x0_x1 )
return f_X

if __name__=='__main__':
parser=ArgumentParser()