# Data fitting using thin-plate spline/interpolation

28 views (last 30 days)
Pelajar UM on 1 Feb 2023
Commented: William Rose on 3 Feb 2023
I have several points in 3D space. I have used the surface fitting function to create a pretty accurate representation.
Now I need to generate an equation with the corresponding coefficients for this surface, so that I can use it elsewhere without having the original data points.
1) What is the equation for the thin-plate interpolation? Like when you use polynomial, sine, fourier, etc, there is a clear equation that describes the data....
2) How do I extract the coefficients? Coeffx only returns 'thinplateinterp'.
x=[0,0,0,0.5,0.5,0.5,1,1,1];
y=[0.001,0.1,10,0.001,0.1,10,0.001,0.1,10];
z=[4.35,1.37,2.31,7.04,3.58,4.14,2.08,2.35,2.43];
ylog=log10(y);
[xData, yData, zData] = prepareSurfaceData( x, ylog, z );
ft = 'thinplateinterp';
[fitresult, gof] = fit( [xData, yData], zData, ft, 'Normalize', 'on' );
Coeffx=coeffvalues(fitresult);

William Rose on 1 Feb 2023
I too am unable to find the coefficients for the thin plate psline model.
I can evaluate the fitted model in two ways:
>> fitresult(.5,-3)
ans =
7.0400
>> evaluate(Coeffx,.5,-3)
ans =
7.0400
The reult with "evaluate(Coeffx,.5,-3)" gives the answer above only if I compute the fit with 'Normalize','off'.
If I compute the fit with 'Normlaize','On', then the output from fitresult(.5,-3) is correct, and is the value shown above, but the output from evaluate(Coeffx,.5,-3) is incorrect.
The wikipedia article for thin plate spline says that there are 2(K+3) parameters in the thin plate spline model, where K=number of fitted points. In your example, K=9, so there should be 24 parameters.
I did the fit in the CurveFitter app also, with the same results. I was also unable to find the coefficients in the curve fitter app, and when I selected the "export to workspace" option, it just exported variables like fitresult, so this did not help identify the parameters.
One can also fit a thin plate spline to the same data by:
p=1; st=tpaps([xData',yData'],zData',p)
The resulting structure, st, includes st.coefs, which is a vector of 12 coefficients. By setting p=1, tpaps() returns an exact-fitting thin plate spline. As p decreases toward 0, the fit becomes increasingly approximate. See the help for tpaps().
William Rose on 3 Feb 2023
@Pelajar UM, thanks for the update.

John D'Errico on 1 Feb 2023
This is a common problem people have with splines in any form. They hope to see some nice simple function they can write down. Maybe put the function into a paper, or use in some way they would use other functional forms.
Sorry. That is pretty much never the case. Splines are great things for some purposes. But if you want to write down that nice looking function, it won't happen.
You can evaluate the function at any point. There are methods provided for that purpose. But if you really need the pretty function you can write down, you will need to use other tools.
x=[0,0,0,0.5,0.5,0.5,1,1,1];
y=[0.001,0.1,10,0.001,0.1,10,0.001,0.1,10];
z=[4.35,1.37,2.31,7.04,3.58,4.14,2.08,2.35,2.43];
ylog=log10(y);
surf(reshape(x,3,3),reshape(ylog,3,3),reshape(z,3,3))
Anyway, using a thin plate spline for such minimal data is probably wild overkill. At best, a simple polynomial model may be sufficient, and about as good as you can do with such limited data.
mdl = fit([x',ylog'],z','poly22')
Linear model Poly22: mdl(x,y) = p00 + p10*x + p01*y + p20*x^2 + p11*x*y + p02*y^2 Coefficients (with 95% confidence bounds): p00 = 1.457 (-0.9711, 3.886) p10 = 9.961 (-0.05327, 19.97) p01 = -0.03542 (-1.641, 1.57) p20 = -9.753 (-19.24, -0.2679) p11 = 0.5975 (-1.079, 2.274) p02 = 0.3229 (-0.2699, 0.9158)
This gives you a nice model you can write down. Not a very good model, but your data is highly limited.
[mdl(x,ylog);z]
ans = 2×9
4.4697 1.8156 1.7447 6.1156 4.0589 4.5856 2.8847 1.4256 2.5497 4.3500 1.3700 2.3100 7.0400 3.5800 4.1400 2.0800 2.3500 2.4300
As you can see, the model does predict the data reasonably well.
[xint,yint] = meshgrid(linspace(0,1),linspace(-3,1));
surf(xint,yint,mdl(xint,yint))
hold on
plot3(x,ylog,z,'ro')
You can even plot it as a nice smooth, well behaved surface.
##### 2 CommentsShowHide 1 older comment
William Rose on 1 Feb 2023
@Pelajar UM, your question is a reasonable one, and I don't know the answer to where the coefficients can be found. I demonstrated with tpaps() how to find 12 coefficients. This is only half the number of coefficients expected, according to the wikipedia article on thin plate splines. I also demonstrated three ways you can use a spline fit to predict values at other points:
fitresult(.5,-3)
evaluate(Coeffx,.5,-3) %works if the fit is done with normalize off
fnval(st,[.5,-3]) %st is obtained with tpaps()

### Categories

Find more on Linear and Nonlinear Regression 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!

Translated by