Using cubic splines to fit data
Show older comments
Hi, I have a quite involved code for fitting cubic splines to data. I have noticed something odd and wondered if anyone had experience with this. For horizontal data, the spline fits extremely well, however for data within a small x range and large y, i.e. a series of vertical points, the spline is very odd! I have attached two images, first the data set and next the resulting fits.. Any help would be appreciated.
Answers (1)
John D'Errico
on 18 Oct 2016
0 votes
First of all, why are you writing cubic spline codes to fit data, if you don't really understand cubic splines, and the issues involved with them?
I'm not sure why I made this an answer, since you say nothing concrete about what EXACTLY you are doing. There are lots of ways you can fit a spline to data, and the data that you have is nothing I would ever decide that a spline would be a good choice for. Do you presume noise in the fit? Is this an interpolating spline? (Why would you do that, EVER? But people do.)
Are you fitting the horizontal lines as separate functions, thus y as function of x for each horizontal set of points? Are the vertical lines fit as x as a function of y? If not, then why not? If you are trying to fit a spline through essentially vertical data in the form of y(x), you should realize that is an insane thing to do. (Sorry but it is.) Or are you somehow trying to fit all of these points at once? (How can I guess what you're doing wrong, when you say nothing?)
The fact is, there are spline codes out there. You would do far better to learn to use an appropriate spline code before trying to write your own. As it is, I'm not at all sure why you are trying to use splines on that data at all.
4 Comments
Matlab User
on 18 Oct 2016
Edited: Matlab User
on 18 Oct 2016
John D'Errico
on 18 Oct 2016
Oh well, at least you are using a good code. What can I say, since it is my own? :) :)
The bad fits for the vertical lines are a direct result of trying to fit them in the form y(x). After all, what can you expect then? If the line was perfectly vertical, with no noise at all in it, then you would have a result that is not even a single valued function of x. It is even worse when there is noise in x though, because then you get the crappy oscillations that you see. SLM cannot possibly know what you are doing, so it assumes that you really have some function y(x), over a TINY range in x, with huge variations in y. It tries to fit the curve as you gave it.
So you CANNOT fit a vertical line in the form y(x). But there is no reason why you cannot invert the data, fitting it as x(y) for the vertical lines. That would resolve many of your problems.
A problem with fitting each line independently is there is no connection at the ends. Is that a problem? Should this be treated as a problem of fitting a perturbed rectangular lattice in some way? So the result could be a set of perturbed rects, that fit together, but need not have 90 degree corners?
I can probably think of scheme that does this in two dimensions. I'm not sure why you are trying to fit a smooth spline to these edges though. Do you really need a smooth curve there? Or would it be sufficient to have some sort of piecewise linear segments?
John D'Errico
on 18 Oct 2016
Edited: John D'Errico
on 18 Oct 2016
You did post the data as a figure, so I can extract the data. I think I can figure out how to employ gridfit to solve this problem...
open Fibres.fig
H = get(gca,'children');
x = H.XData;
y = H.YData;

I guess the question is, before I go further, how much of the variability in this data do you need to follow? What is your eventual goal? For example, do you want to turn this into a set of 4 slightly curvy-edged rects? Or would it be sufficient to simply replace those noisy lines with straight edges, though not necessarily meeting at right angles? So those nominal squares might turn into general 4 sided polygons?
Matlab User
on 20 Oct 2016
Categories
Find more on Get Started with Curve Fitting Toolbox in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!