Code covered by the BSD License  

Highlights from
Spline2D or Piecewise Continuous 2D Polynomials

image thumbnail

Spline2D or Piecewise Continuous 2D Polynomials


Mark Mikofski


Fit a 2D function with piecewise continuous polynomials



spline2D example

Initialize a clean workspace. Save your work first!

clear all
close all

Set up test 2D polynomial.

[x,y] = meshgrid(-3:4,-3:4); % independent variables
% EG: Make a test 2D polynomial with coeffiecients 1, 2, 3, 4, 5, 6
% that is 2nd-order (quadratic) in x-direction, and 1st order (linear)
% in y-direction.
test2DPoly = polyVal2D([1,2,3,4,5,6],x,y,2,1); % a test 2D polynomial

Fit test polynomial with spline (piecewise continuous polynomials).

Split region at 0 in x-direction and at -1 and 1 in y-direction, so there are 6 regions and also 6 boundaries to fit. In each of the 6 regions fit to 2nd order in x-direction and 1st order in y-direction. Use the default number of gridpoints along the boundaries (IE: don't specify).

fit2DSpline = splineFit2D(test2DPoly,x,y,2*ones(2,3),ones(2,3),0,[-1 1]); % spline fit
test2DSpline = splineVal2D(fit2DSpline,x,y,2*ones(2,3),ones(2,3),0,[-1 1]); % evaluate
% another example with 9 regions and 9 boundaries!
% fit2DSpline = splineFit2D(test2DPoly,x,y,2*ones(3),ones(3),[-1 1],[-1 1]);
% test2DSpline = splineVal2D(fit2DSpline,x,y,2*ones(3),ones(3),[-1 1],[-1 1]);

plot results

testRange = [min(test2DPoly(:));max(test2DPoly(:))];
testRange = [testRange(1) - diff(testRange)/10; ...
    testRange(2) + diff(testRange)/10] * [1 1];
figure, subplot(1,2,1)
scatter(x(:),test2DPoly(:),750,y(:),'.'), hold('on')
plot([0 0],testRange,'--','LineWidth',2.5), hold('off'), grid
xlabel('x'), ylabel('test2DPoly')
legstr = cellstr([repmat('y_{spline} = ',8,1),num2str((-3:4)')]);
scatter(y(:),test2DPoly(:),750,x(:),'.'), hold('on')
plot([-1 1;-1 1],testRange,'--','LineWidth',2.5), hold('off'), grid
xlabel('y'), ylabel('test2DPoly')
legstr = cellstr([repmat('y_{spline} = ',8,1),num2str((-3:4)')]);

Contact us