0% found this document useful (0 votes)
113 views5 pages

University of Balamand: Faculty of Engineering Department of Mechanical Engineering

This document contains code for performing cubic spline interpolation. It defines a function that takes in vectors of x and y coordinates (xi and a), finds the coefficients for cubic polynomials between each point, and evaluates these polynomials to interpolate a y value for any given x coordinate. The code is tested by inputting sample x and y vectors and interpolating the y value for x=2.5.

Uploaded by

Jad Chalhoub
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
113 views5 pages

University of Balamand: Faculty of Engineering Department of Mechanical Engineering

This document contains code for performing cubic spline interpolation. It defines a function that takes in vectors of x and y coordinates (xi and a), finds the coefficients for cubic polynomials between each point, and evaluates these polynomials to interpolate a y value for any given x coordinate. The code is tested by inputting sample x and y vectors and interpolating the y value for x=2.5.

Uploaded by

Jad Chalhoub
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd

UNIVERSITY OF BALAMAND

FACULTY OF ENGINEERING
DEPARTMENT OF MECHANICAL ENGINEERING

Course:
Engineering Research and Analysis
Homework #2: Cubic Spline Interpolation
Instructor Name:
Dr. Elie Honein

Team Members:
Jad Chalhoub
Micha Nassar
Elie Harb

Date: 10/12/2014

CODE:
% Cubic Spline Interpolation - Natural Spline
% INPUT: xi is the grid (points on x-axis) and a are points on y-axis. inter
% is the point on the x-axis you want to know the value of on the y-axis.
function [a_inter] = cubic_spline(xi,a,inter)
if length(xi) ~= length(a)
erro('vectors xi and a must be of same length');
end
% Plotting points we want to interpolate between:
grid on; hold on;
title('Cubic Spline Interpolation');
plot(xi,a,'or');
n = length(xi);
% Vector h with subintervals:
h = zeros(n-1,1);
for j = 1:n-1
h(j) = xi(j+1) - xi(j);
end
% Coefficient matrix A:
A = zeros(n);
% Natural Spline boundary conditions:
A(1,1)= 1;
A(n,n) = 1;
for i = 2:n-1
A(i,i-1) = h(i-1);
A(i,i) = 2*(h(i-1)+h(i));
A(i,i+1) = h(i);
end
% Vector b:
b = zeros(n,1);
for i = 2:n-1
b(i) = (3/h(i))*(a(i+1)-a(i)) - (3/h(i-1))*(a(i)-a(i-1));
end
% Coefficient vector cj:
cj = A\b;

% Coefficient vector bj:


bj = zeros(n-1,1);
for i = 1:n-1
bj(i) = (1/h(i))*(a(i+1)-a(i)) - (1/3*h(i))*(2*cj(i)+cj(i+1));
end
% Coefficient vector dj:
dj = zeros(n-1,1);
for i = 1:n-1
dj(i) = (1/(3*h(i))) * (cj(i+1)-cj(i));
end
% Making a matrix P with all polynomials
P = zeros(n-1,4);
for i = 1:n-1
P(i,1) = dj(i);
P(i,2) = cj(i);
P(i,3) = bj(i);
P(i,4) = a(i);
end
% Plotting results:
resolution = 100;
for i = 1:n-1
f = @(x) a(i) + bj(i).*(x-xi(i)) + cj(i).*(x-xi(i)).^2 + dj(i).*(x-xi(i)).^3;
xf = linspace(xi(i),xi(i+1),resolution);
plot(xf,f(xf),'b');
end
% Given a value on the x-axis, inter, that we wish to know the y-value of,
% we must first find in which interval inter is. We will use bisection
% search to accomplish this. Interval must be ascending or descending.
jl = 1;
ju = n;
while (ju - jl > 1)
jm = ceil((jl + ju)/2);
if (inter < xi(jm))
ju = jm;
else
jl = jm;
end
end
a_inter = polyval(P(jl,:), inter-xi(jl));
fprintf('\n The interpolated value is: %f \n', a_inter);
plot(inter, a_inter, 'og');
end

EXAMPLE:
Test-run:
EDU>> xi = [1 2 3 4 5 6 7 8 9 10]; a = [-5 2 4 1 -3 -8 2 8 12 16];
EDU>> cubic_spline(xi,a,2.5)
The interpolated value is: 3.780549
ans =
3.7805

You might also like