# Cubic Spline Interpolation Tutorial

1. Jul 31, 2007

### hotvette

Attached below are two cubic spline tutorials:

1. Explanation of the classic tri-diagonal cubic spline formulation. Included are 2 example problems.

2. Extension to parametric cubic splines. Included are 2 example problems
.

#### Attached Files:

File size:
65.3 KB
Views:
6,035
• ###### Parametric Spline Tutorialv2.pdf
File size:
102.8 KB
Views:
3,172
Last edited by a moderator: Mar 3, 2008
2. Oct 19, 2007

### Drager

wow,

After a very long search in google i found this tutorial.

And it was the first one, which describes parametric cubic splines in a good way.

Thank you very much :-)

Now i can lay streets through my landscape :-)

3. Oct 31, 2007

### Cyko007

Sigh....Thank You!

I was missing something very stupid and now I know what it is!

4. Jan 15, 2008

### emer

Thank you for tutorials. This has helped me very mush.

5. Mar 2, 2008

### harshm

Cubic Spline Interpolation of a Circle

Hey there -
Thanks for the great tutorials - they really helped me! I'm trying to duplicate your results for cubic interpolation of a circle with 4 points and I got the same solution for the 2nd derivatives in the x and y directions. However, when I solve for the coefficients and plot the cubic polynomials I can't seem to get the same result as you - Heres the code that calculates the coefficients (in MATLAB)

mx - x''
my - y''
Sx - x coefficients
Sy - y coefficients
s - arc length [0 0.25 0.5 0.75 1]

for i = 1:n-1
Sx(i,1) = (mx(i+1) - mx(i))/6*h;
Sx(i,2) = mx(i)/2;
Sx(i,3) = (x(i+1) - x(i))/h - h*(mx(i+1) + 2*mx(i))/6;
Sx(i,4) = x(i);

Sy(i,1) = (my(i+1) - my(i))/6*h;
Sy(i,2) = my(i)/2;
Sy(i,3) = (y(i+1) - y(i))/h - h*(my(i+1) + 2*my(i))/6;
Sy(i,4) = y(i);

end

%Plotting the function
ds = 0.01;
m=1;
i=1;
for i = 1:n-1
for k = s(i):ds:s(i+1)
genpnx(m) = Sx(i,1)*(k - s(i))^3 + Sx(i,2)*(k-s(i))^2 + Sx(i,3)*(k-s(i)) + Sx(i,4);
genpny(m) = Sy(i,1)*(k - s(i))^3 + Sy(i,2)*(k-s(i))^2 + Sy(i,3)*(k-s(i)) + Sy(i,4);
m = m+1;
end
i
end

plot(genpnx,genpny,'r')

Do you have any idea what I might be doing wrong? (Ive attached an image of what the spline looks like for 4 points)

Thanks!

#### Attached Files:

• ###### spline.jpg
File size:
12.8 KB
Views:
448
Last edited: Mar 2, 2008
6. Mar 3, 2008

### hotvette

Though I'm not a MATLAB person, your expressions for calculating the coefficients look correct. Make sure you are using 0.25 for h. Also, for plotting, t should vary from 0 to 0.25 for each segment.

Here are the coefficient values I got for the 1st segment:

ax = 32
bx = -24
cx = 0
dx = 1

ay = -32
by = 0
cy = 6
dy = 0

Actually, this isn't the best way to fit a circle with cubic polynomials. It is better to fit a quarter circle with a single parametric cubic. The tutorial has been updated - check it out.

Last edited: Mar 3, 2008
7. Mar 3, 2008

### harshm

Solution

Thanks for the coefficients - they helped me figure out what the problem was - a syntax problem - the correct expression for the coefficients are

Sx(i,1) = (mx(i+1) - mx(i))/(6*h)

Sx(i,1) = (mx(i+1) - mx(i))/6*h

Thanks a ton!

8. Mar 3, 2008

### hotvette

Glad to help. Fyi, the problem can be made even simpler by making h = 1, meaning s = [0 1 2 3 4]. Second deriveratives are x" = [-3 0 3 -3], y" = [0 -3 0 3 0] and plotting can be done for t varying from 0 to 1 for each segment.

I encourage you to review the updated tutorial on circle fitting.

9. Mar 12, 2008

### hotvette

Attached is an update to the Cubic Spline Tutorial.

To Staff,

Would someone be willing to replace the 1st attachment in this thread with the below? Thanks.

Last edited: Dec 17, 2008
10. Nov 22, 2008

### vimspal

thanks a lot buddy.

11. Dec 17, 2008

### spacecamel

Hi hotvette,
I have been looking for a good tutorial on Cubic Splines, nice work. I have found what I think might be an error in one of your examples, however. Example Problem #1 shows c2 = 0, but when I plug in the values:
y3 = 1
y2 = 0.125
h2 = .5
y3" = 0
y2" = 4.5
I come up with c2 = 1, not 0. Plugging 0.5 into the second polynomial with c2 = 1, I get y2 = 1, thus resulting in a discontinuity with the first polynomial. I'm too lazy to try to work out the root of the problem, but I figured I'd flag the discrepancy.
Cheers

12. Dec 17, 2008

### hotvette

Agree that C2 = 1.0 (typo), but I think the evaluation of the 2nd poly is OK:

$$y = a2(x - x_2)^3 + b2(x - x_2)^2 + c2(x - x_2) + d2$$

Update with typo fixed is attached.

#### Attached Files:

• ###### Cubic Spline Tutorial v3.pdf
File size:
109.2 KB
Views:
1,345
13. Dec 17, 2008

### spacecamel

Yep, my mistake. I used ax^3 + bx^2 + cx + d rather than using (x-x0), etc.
Thanks again for the excellent tutorial.

14. Dec 29, 2008

### goslar

For the cubic spline interpolation if we have
A=(x2-x)/h; B=(x-x1/h); C=1/6*(A^3-A)*h^2; D=1/6*(B^3-B)*h^2;
y=A y1 + B y2 + C y1'' + D y2''

What is the interpolation error of above?

For example for Hermitian cubic spline it is smaller than 5/384 ||f^{(4)}|| h^4

15. Apr 8, 2009

### cpile

Thanks very much my friend! The tutorial for the parametric C Splines was very helpful to me!
You see, every book I ve read doesn t say how we can relate the derivatives of the actual curve to the derivatives of the parametric equations of x & y. Ok, its easy to proof with the chain rule but what about the values of these derivatives on bounds!! Simply, x'(t)/y'(t) must be constant on bounds, so give x'(t),y'(t) any value you want to keep this ratio constant! HAHAHAH, i feel stupid...
Thanks again!

16. Oct 16, 2009

### \$am!

Thanks! Just what i was looking for! :)

17. Nov 15, 2009

### ark5230

Any reading suggestion to smooth out a curve using spline or similar approach.

18. Nov 24, 2009

### Eddythekid

great tuto, very precise. Thanks a lot

19. Jul 19, 2010

Thanks

20. Jul 21, 2010

### amoskoh

I have trouble implementing the interpolation. not sure what is wrong. appreciate if someone can point out which part I'm wrong. Im pretty sure I have the coefficients correct but somehow im using the spline equations incorrectly (my guess).
So here are my original x and y
x y
0.90 1.30
1.30 1.50
1.90 1.85
2.10 2.10
3.00 1.95
3.80 0.40
4.30 0.25

Here are my coefficients
a b c d
Equation 1 -0.282 0.000 0.545 1.30
Equation 2 1.046 -0.338 0.410 1.50
Equation 3 -4.815 1.545 1.134 1.85
Equation 4 -0.162 -1.344 1.174 2.10
Equation 5 1.757 -1.780 -1.638 1.95
Equation 6 -1.625 2.437 -1.112 0.40

Now If I want to interpolate x=1, my formula would read
y=-0.282*(1-0.9)^3 + 0.000*(1-0.9)^2 +0.545*(1-0.9) + 1.30
y=1.354230991

I think the answer is wrong because I validated it against the utility at http://www.akiti.ca/CubicSpline.html.. Would appreciate if someone can tell me if my coefficients are correct and if i am using the formulas correctly.

Thanks