Code covered by the BSD License  

Highlights from
Approximation of 2-D Data by Natural Cubic Spline

image thumbnail
from Approximation of 2-D Data by Natural Cubic Spline by Dr. Murtaza Khan
Approximation (Data Fitting) by Natural Cubic Spline.

Testncs2dapprox.m
close all, clc, clear all 

%%%%%%%%%%%%%%%%%%%%%%%%% SINE APPROXIMATION %%%%%%%%%%%%%%%%%%%%%%
disp('Sine Approximation using Natural Cubic Spline');
x = -pi:.05:pi; x=x';
y = sin(x);   
size(x)
ei= length(x);
initialbreaks=[1;ei]; % user provided indices of initial break points (or corer points/control points)
%initialbreaks=[1;floor(ei/2);ei]; % OR first, middle, last
MaxAllowedDist=.05; % Max. allowed Distance b/w original data and fitted parametric spline
MaxAllowedSqDist=MaxAllowedDist^2 % Max. allowed Square Distance... 


%%%  Some possible combinations to call the function ncs2dapprox.
%%  Use only one , comments others


%[bx,by,finalbreaks]=ncs2dapprox(x,y)                             % 1     

%[bx,by,finalbreaks]=ncs2dapprox(x,y,MaxAllowedSqDist)            %or 2  
 
%[bx,by, finalbreaks]=ncs2dapprox(x,y,MaxAllowedSqDist)           %or 3  (recommended call)   

%[bx,by,finalbreaks]=ncs2dapprox(x,y,MaxAllowedSqDist,initialbreaks)      % or 4    

%[bx,by,finalbreaks]=ncs2dapprox(x,y,MaxAllowedSqDist,initialbreaks)       % or 5

[bx,by,finalbreaks,MasSqDist]=ncs2dapprox(x,y,MaxAllowedSqDist)  % or 6 (recommended call)   

 %[bx,by,finalbreaks,MasSqDist]=ncs2dapprox(x,y,MaxAllowedSqDist,initialbreaks)  % or 7


%%% Now we can only save break points/control points i.e. bx,by and their indices i.e. finalbreaks, optionally  MasSqDist and any time we can
%%% generate the approximation of original data by spline interpolation
%%% using finalbreaks,bx,by

%%% Now we would use the control points returned by fuction to generate
%%% approximationg Spline using spline interpolation

t = finalbreaks';    
pp1= spline(t,[bx,by]');
range = linspace(1,finalbreaks(end),finalbreaks(end)); 
xiyi = ppval(pp1,range);
xi=xiyi(1,:)';
yi=xiyi(2,:)';
    
figure ,hold on
plot(bx,by,'ro','LineWidth',2)
plot(x,y,'b','linewidth',2)
plot(xi,yi,'g','linewidth',2)
title('\bf{<Blue: Original Data>,<Green: Spline Approximation>,<Red Circle: Break Point>}');

%%%%%%%%%%%%%%%%%%%%% CIRCLE APPROXIMATION %%%%%%%%%%%%%%%%%%%%%%
disp('----------------------------------------------');
disp('Circle Approximation using Natural Cubic Spline');
 
rad=1;
theta = linspace(0, 2*pi, 300);
x = rad*cos(theta);
y = rad*sin(theta);

ei= length(x);
initialbreaks=[1;ei];
MaxAllowedDist=.05; % Max. allowed Distance b/w original data and fitted parametric spline
MaxAllowedSqDist=MaxAllowedDist^2 % Max. allowed Square Distance... 

[bx,by,finalbreaks,MasSqDist]=ncs2dapprox(x,y,MaxAllowedSqDist,initialbreaks)      

t = finalbreaks';    
pp1= spline(t,[bx,by]');
range = linspace(1,finalbreaks(end),finalbreaks(end)); 
xiyi = ppval(pp1,range);
xi=xiyi(1,:)';
yi=xiyi(2,:)';

figure ,hold on
plot(bx,by,'ro','LineWidth',2)
plot(x,y,'b','linewidth',2)
plot(xi,yi,'g','linewidth',2)
axis equal
title('\bf{<Blue: Original Data>,<Green: Spline Approximation>,<Red Circle: Break Point>}');

%%%%%%%%%%%%%%%%%%%%%%%%%  FIVE APPROXIMATION  %%%%%%%%%%%%%%%%%%%%%%%
disp('----------------------------------------------');
disp('Five Approximation using Natural Cubic Spline');

M = dlmread('five.txt'); % read from ASCII file
x=M(:,1);
y=M(:,2);
clear M
ei= length(x);
initialbreaks=[1;ei];
MaxAllowedDist=4; % Max. allowed Distance b/w original data and fitted parametric  spline
MaxAllowedSqDist=MaxAllowedDist^2 % Max. allowed Square Distance... 

[bx,by,finalbreaks,MasSqDist]=ncs2dapprox(x,y,MaxAllowedSqDist)     


t = finalbreaks';        % t        is 1 x n column vector
pp1= spline(t,[bx,by]'); % [bx,by]' is 2 x n column vector
[breaks,coefs,l,order,d] = unmkpp(pp1);
range = linspace(1,finalbreaks(end),finalbreaks(end)); 
xiyi = ppval(pp1,range);
xi=xiyi(1,:)';
yi=xiyi(2,:)';

figure ,hold on
plot(bx,by,'ro','LineWidth',2)
plot(x,y,'b','linewidth',2)
plot(xi,yi,'g','linewidth',2)
title('\bf{<Blue: Original Data>,<Green: Spline Approximation>,<Red Circle: Break Point>}');


% % % --------------------------------
% % % Author: Dr. Murtaza Khan
% % % Email : drkhanmurtaza@gmail.com
% % % --------------------------------

Contact us at files@mathworks.com