Math Notes: Lagrange interpolation
This is a small set of posts that come into the category of “notes”: self-explanations of concepts that I have recently picked up and found interesting.
Lagrange Interpolation
Lagrange Interpolation is a concept that allows us to find a polynomial of least degree passing through a given set of points. Specifically:
If $S = {(x_i, y_i) : x_i, y_i \in R, 1 \lt i \le n}$, then the polynomial of least degree passing through all the points in $S$ is given by $$P(x) = \sum_{i=1}^n L_i(x) \cdot y_i$$ where $$L_i(x) = \frac{(x-x_1)(x-x_2)…(x-x_{i-1})(x-x_{i+1})…(x-x_n)} {(x_i-x_1)(x_i-x_2)…(x_i-x_{i-1})(x_i-x_{i+1})…(x_i-x_n)}$$ or simply, $$P(x) = \sum_{i=1}^n \frac{\prod_{r \ne i}(x-x_r)}{\prod_{r \ne i}{(x_i-x_r)}} \cdot y_i$$ note that the degree of polynomial $P < n$.
Here’s an example:
If $P(x)$ is a function such that $P(-1) = -2, P(0) = 2, P(1) = 0, P(2) = 2$, then find $P(x)$
So we have $S = {(-1,-2), (0,2), (1,0), (2,2)}$. Using lagrange interpolation gives us $P(x)$ as: $$\begin{gather} P(x) = \frac{(x-0)(x-1)(x-2)}{(-1-0)(-1-1)(-1-2)} \cdot -2 + \\ \frac{(x+1)(x-1)(x-2)}{(0+1)(0-1)(0-2)} \cdot 2 + \\ \frac{(x+1)(x-0)(x-2)}{(1+1)(1-0)(1-2)} \cdot 0 + \\ \frac{(x+1)(x-0)(x-1)}{(2+1)(2-0)(2-1)} \cdot -2 \end{gather}$$ or, once simplified, $$P(x) = x^3 - 3x + 2$$
This technique is also useful for other stuff, such as finding patterns in hard-to-decipher sequences:
Find the nth term of the sequence $$5, 65, 325, 1025, 2501 …$$
Letting $T(1) = 5, T(2) = 65$ and so on, lagrange interpolation gives us: $$\begin{gather} T(n) = \frac{5(x-2)(x-3)(x-4)(x-5)}{(-1)(-2)(-3)(-4)} + \\ \frac{65(x-1)(x-3)(x-4)(x-5)}{(1)(-1)(-2)(-3)} + \\ \frac{325(x-1)(x-2)(x-4)(x-5)}{(2)(1)(-1)(-2)} + \\ \frac{1025(x-1)(x-2)(x-3)(x-5)}{(3)(2)(1)(-1)} + \\ \frac{2501(x-1)(x-2)(x-3)(x-4)}{(4)(3)(2)(1)} \end{gather}$$ simplified: $$T(n) = 4n^4 + 1$$
Of course, there are some problems that cannot be solved by this technique, namely problems where it is specified that the polynomial is of a higher order than the number of points it passes through:
Let $P(x)=x^4+ax^3+bx^2+cx+d$. If $P(1) = 1, P(2)=8, P(3)=27, P(4)=64$, then the value of $P(5)$ is?
The lagrange interpolated polynomial for the above values is $P(x) = x^3$. However, this gives the wrong answer of $P(5) = 125$. The correct answer is $P(5) = 149$, because we have been asked to fit a polynomial of higher order in this equation.
Also, this technique should only be used as a last resort for pattern finding.
This is extremely computation heavy and is more of a bruteforce algorithm, that
is better suited to computers rather than manual calculation. Most math softwares
have a lagrange interpolation function in them. Geogebra’s is called Polynomial()
.
As a bonus, here’s the code I used to generate the above function:
import sys
pts = []
for i in range(1,len(sys.argv),2):
pts.append([int(sys.argv[i]), int(sys.argv[i+1])])
output = "P(x) = "
for i in pts:
nr = ""
dr = ""
for r in pts:
if r is i:
continue
dr += "({})".format(i[0]-r[0])
if r[0] < 0:
nr += "(x+{})".format(-r[0])
else:
nr += "(x-{})".format(r[0])
output += "\\frac{{{2}{0}}}{{{1}}} + ".format(nr,dr,i[1])
print(output)