Lecture Handouts and Examples

| CS 322 Home

Lec 3  Feb 2
Lec 4  Feb 4
Lec 10  Feb 25

Lecture 10 Wednesday, February 25

 

 

% Script Lec10
% Looks at second derivative continuity of pwcubic hermite interpolant
bigscreen
close all
for s2 = [-10  -5  -1  -5/6  1   5  10 100]
    figure
    ShowSmallSpline(s2)
    pause(2)
end

  function ShowSmallSpline(s2)
% Displays the piecewise cubic hermite interpolant of the data
%
%                      (0,1,2), (1,3,s2), (2,-1,1)
%
% On [0,1] we have the cubic q1(z) = 1 + 2z +(s2-2)z^2(z-1) which satisfies
%
%         q1(0) = 1, q1'(0) = 2, q1(1) = 3, q1'(3) = s2
%
% It has second derivative
%
%         q1"(z) = 2(s2-2) + 6(s2-2)z


% The cubic q2(z) = 3 + s2(z-1) + (-4 - s2)(z-1)^2  + (9+s2)(z-1)^2(z-2)
%
%         q2(1) = 3, q1'(1) = s2,  q2(2)=-1, q2'(2) = 1
%
% It has second derivative
%
%         q2"(z) = 2(-4-s2) + (9+s2)(4(z-1) + 2(z-2))
%
% The equation q1"(1) = q2"(1) says
%
%               2(s2-2) +6(s2-2)  =  2(-4-s2) + (9+s2)(-2)
%
% i.e., s2 = 5/6. When this is the case we have a cubic spline interpolant.

close all

% Evaluate the two local cubics...
zL = linspace(0,1);
q1Vals = 1 + 2*zL + (s2-2)*(zL.^2).*(zL-1);
zR = linspace(1,2);
q2Vals = 3 + s2*(zR-1) + (-4-s2)*(zR-1).^2  + (9+s2)*((zR-1).^2 ).*(zR-2);

% Display
subplot(2,1,1)
plot(zL,q1Vals,zR,q2Vals,[0 1 2],[1 3 -1],'o')
legend('q1(z)','q2(z)')
title(sprintf('An n=2 piecewise cubic hermite interpolant with s2 = %5.2f',s2),'fontsize',18)

% Display their second derivatives
subplot(2,1,2)
plot(zL,2*(s2-2) + 6*(s2-2)*zL, zR,2*(-4-s2) + (9+s2)*(4*(zR-1)+2*(zR-2)))
legend('q1"(z)','q2"(z)')
title('It''s second derivative...','fontsize',18)

Lecture 4. Wednesday, February 4

Read about InterpV and HornerV in Chapter 2 of SCMV.
% Lec4A
% Plots random cubic interpolants of sin(x) on [0,2pi].
% Uses the Vandermonde method.

close all
x0 = linspace(0,2*pi,100)';
y0 = sin(x0);
for eg=1:30
   x = 2*pi*sort(rand(4,1));
   y = sin(x);
   a    = InterpV(x,y);
   pVal = HornerV(a,x0);
   plot(x0,y0,x0,pVal,'--',x,y,'r*')
   axis([0 2*pi -2 2])
   title('A Random Cubic Interpolant of sin(x) on [0,2\pi]' )
   legend('sin(x)','Cubic Interpolant')
   grid on
   shg
   pause
end
clc
grid off

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Lec4B
% Equally spaced interpolants of sin(x) on [0,2pi].
% Uses the Vandermonde method.

close all
x0 = linspace(0,2*pi,100)';
y0 = sin(x0);
for deg=1:20
   x = linspace(0,2*pi,deg+1)';
   y = sin(x);
   a    = InterpV(x,y);
   pVal = HornerV(a,x0);
   subplot(2,1,1)
   plot(x0,y0,x0,pVal,'--',x,y,'r*')
   axis([0 2*pi -2 2])
   s = sprintf('deg %1d Interpolant of sin(x)',deg);
   title(s)
   legend('sin(x)','Polynomial Interpolant')
   subplot(2,1,2)
   absErr = abs(pVal-y0);
   plot(x0,absErr)
   axis([0 2*pi -inf inf])
   s = sprintf('Approx maximum absolute error = %5.1e',max(absErr));
   title(s,'fontsize',24)
   shg
   pause
end
clc

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Lec4c
% Equally spaced interpolants of 1/(1+25x^2) on [-1 1].
% Uses the Vandermonde method.

close all
f = inline('1./(1+25*x.^2)');
x0 = linspace(-1,1,100)';
y0 = feval(f,x0);
for deg=1:20
   x = linspace(-1,1,deg+1)';
   y = feval(f,x);
   a    = InterpV(x,y);
   pVal = HornerV(a,x0);
   subplot(2,1,1)
   plot(x0,y0,x0,pVal,'--',x,y,'r*')
   s = sprintf('deg %1d Interpolant of 1/(1+25x^{2})',deg);
   title(s,'fontsize',24)
   legend('1/(1+25x^{2})','Polynomial Interpolant',0)
   subplot(2,1,2)
   absErr = abs(pVal-y0);
   plot(x0,absErr)
   s = sprintf('Approx maximum absolute error = %5.1e',max(absErr));
   title(s,'fontsize',24)
   shg
   pause
end
clc

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Script Lec4d
  close all
  
  ShowInterp('sin',0,2*pi,5)
  
  figure
  g = inline('sin(2*x)');
  ShowInterp(g,0,2*pi,5)
  
  figure
  ShowInterp(@sin,0,2*pi,5)
  
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

  function ShowInterp(fName,a,b,deg)
% fName is a string that names a function f defined on
% [a,b]. Assume a < b
% deg is a positive integer
% Displays the equal-spacing, degree d polynomial interpolant 
% of f on [a,b].

% Display the function over  the interval...
  x = linspace(a,b)';
  y = feval(fName,x);
  plot(x,y);
  axis([a b -inf inf])

% Display the points of interpolation
  hold on
  x0 = linspace(a,b,deg+1)';
  y0 = feval(fName,x0);
  plot(x0,y0,'or')
  
% Generate the interpolant
  a = InterpV(x0,y0);
  
% Evaluate the interpolant across the interval and display.
  pVals = HornerV(a,x);
  plot(x,pVals,'r')
  hold off
  shg

Lecture 3. Monday, February 2

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Script Lec3A

x = linspace(-7,7);
y = MyExp(x); 
shg

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

  function y = MyExp(x)
% x is a vector
% y has the same length and orientation with 
% y(i) = exp(x(i)), i = 1:length(x)

y = ones(size(x));    % y = vector of all 1's, same size & shape as x
termIndex = 1;
termNext  = x;
yNext = y + termNext;
while(any(y~=yNext))

    % Iterate as long as the addition of the next term makes a difference
    y = yNext;
    termIndex = termIndex + 1;
    termNext = (termNext.*x)/termIndex;
    yNext = yNext + termNext;
    
    % Display the relative error
    relErr = abs(yNext - exp(x))./exp(x);
    % Add eps to relErr so don't evaluate log at zero.
    semilogy(x,relErr+eps,[min(x) max(x)] ,[10^-15 10^-15],'r')
    title(sprintf('Number of terms = %1d',termIndex))
    ylabel('Relative Error')
    xlabel('x')
    shg
    pause
    
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Script Lec3B
% Explores running sums in Taylor expansion for exp(x)

close all
x = -7;
nTerms = 30;

sum  = zeros(1,nTerms);
term = zeros(1,nTerms);

sum(1)  = 1 + x;
term(1) = x;

for k=2:nTerms
    term(k) = x*term(k-1)/k;
    sum(k) = sum(k-1) + term(k);
end
semilogy(1:nTerms,abs(sum),1:nTerms,abs(term))
title(sprintf('exp(%5.1f) via taylor series',x))
xlabel('k')
legend('1 + term(1) + ... + term(k)',' | term(k) |')
shg