# Function approximation solving a Vandermonde system

## Topics in this lab

## Introduction

Every calculus student knows that working with polynomials is often much
easier than working with more complicated functions. For example, it
is easy to compute the derivatives of polynomials.

For this reason,
among others, it is often useful to approximate more complicated
functions with polynomials. In this case, we typically sample the
function $y = f(x)$
at a set of points $\{x_j\}$
for $j=0,1,2,...,N$ to get a set of
points $(x_j,y_j)$. In this situation,
we want our polynomial $p(x)$ to got
through, or *inteprolate* our data points. Approximating
functions with polynomials is part of a specialized area of mathematics
called *approximation theory*.

A common way to handle this situation is to use the Matlab command
polyfit. We will also see how the Matlab command vander can be used to obtain the same set of
coefficients.

clear all; close all;

Back to the top

## Function approximation using polynomials

In this example, we will approximate the

f = @(x) sin(2*pi*x); % Function we wish to approximate N = 10; % Degree of the polynomial % Sample the function at a set of equally spaced points. xdata = linspace(-1,1,N+1); ydata = f(xdata);

Get the coefficients of the interpolating polynomial using polyfit

a = polyfit(xdata,ydata,N);

The resulting polynomial has the form $$ p(x) = a_n x^n + a_{n-1} x^{n-1} + ... + a_1 x + a_0 $$ where the coefficients $a_i$ are stored in the array a. To evaluate the polynomial, we use the Matlab routine polyval as follows.

xs = linspace(-1,1,200); % set of points used to plot the polynomial ys = polyval(a,xs); plot(xs,ys,'r','linewidth',2); hold on; plot(xs,f(xs),'b--'); % Plot the original function plot(xdata,ydata,'k.','markersize',30); title('Function approximation using polyfit','fontsize',18); legend({'Poly. approx.','f(x)', 'Sampled data'},'fontsize',16);

Back to the top

## Approximating derivatives

To compute derivatives of the polynomial approximation, we need to be able to compute derivatives of a polynomial described by a set of coefficients. To compute the derivative of the polynomial obtained using polyfit, we use polyder as

clf; fp = @(x) 2*pi*cos(2*pi*x); % Derivative of f(x) = sin(2*pi*x) a_deriv = polyder(a); % Differentiate coefficients % Obtain the value of the derivative at a dense set of points ys_deriv = polyval(a_deriv,xs); ydata_deriv = polyval(a_deriv,xdata); plot(xs,ys_deriv,'r','linewidth',2); hold on; plot(xs,fp(xs),'b--') title('First derivative','fontsize',18); legend({'1st deriv. approx.','f''(x)'},'fontsize',16);

Notice the scale on the y-axis. The derivative is quite large.

Continuing in this fashion, we can plot the second derivatives of each of
these interpolants.

clf; fpp = @(x) -(2*pi)^2*sin(2*pi*x); % Second derivative of f(x) a_deriv2 = polyder(a_deriv); % Coefficients of the second derivative % Obtain second derivative at a dense set of points ys_deriv2 = polyval(a_deriv2,xs); plot(xs,ys_deriv2,'r','linewidth',2); hold on; plot(xs,fpp(xs),'b--'); title('Second derivative','fontsize',18); legend({'2nd deriv. approx.','f''''(x)'},'fontsize',16);

Back to the top

## The Vandermonde system

The function polyfit solves the
*Vandermonde* system, given by
$$
\left[\begin{array}{ccccc}
x_0^n & x_0^{n-1} & ... & x_0 & 1 \\
x_1^n & x_1^{n-1} & ... & x_1 & 1 \\
\vdots & \vdots & \ddots & \vdots & \vdots \\
x_n^n & x_n^{n-1} & ... & x_n & 1 \\
\end{array}\right]
\left[\begin{array}{c}
a_n \\ a_{n-1} \\ \vdots \\ a_1 \\ a_0
\end{array}\right] =
\left[\begin{array}{c}
y_0 \\ y_1 \\ \vdots \\ y_{n-1} \\ y_{n}
\end{array}\right]
$$
We can write this system as
$$
V{\bf a} = {\bf y}
$$
We can construct this system explicity using function vander.

V = vander(xdata); a = V\ydata(:);

The set of coefficients we get are identical to those obtained using polyfit.

Back to the top

## Lab exercises

- Find the slope and the y-intercept of the line that passes through the two points $(-3.2, 1.2)$ and $(5.4,-4.3)$.
- Find the maximum value of the parabola that passes through the three points $$(-3.2, 4.5), \quad (1.2,6.1), \quad (6.1,-3.4)$$

Back to the top

## Get the code

Do you want to try the above code fragments on your own? Download the Matlab script that produces this page here. (lab_9.m)

Published with MATLAB® 8.5