%% Function approximation solving a Vandermonde system %% 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; %% 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); %% 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); %% 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. % %% Lab exercises % %
% For each of the following problems, use the vander % function to answer the questions. Plot the data points and the % curve you find. %
    %
  1. 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)$.
  2. %
  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)$$ %
%
%