# 3D - Surface Response Plot - Surface of best fit

14 views (last 30 days)
Muhammad Hamza Saloojee on 30 Oct 2020
Commented: Ameer Hamza on 31 Oct 2020 at 9:08
I'm having trouble plotting a curve/surface of best fit through data points. I have z - matrix of 9 data points, which correspend to different combinations of values from an x-vector of 3 and a y-vector of 3. I have managed to plot a surface plot which uses interpolation and fits a curve through the data. Instead of this, I would like to plot a curve of best fit through the data points using a low order polynomial instead.
Assistance would be greatly appreciated.
This is a plot of what I have so far. Ameer Hamza on 30 Oct 2020
Edited: Ameer Hamza on 30 Oct 2020
If you have a curve fitting toolbox, you can use fit(): https://www.mathworks.com/help/curvefit/fit.html function with fitype chosen from polyij as given here: https://www.mathworks.com/help/curvefit/list-of-library-models-for-curve-and-surface-fitting.html#btbcxlm. For example
x; % x-values 9x1
y; % y-values 9x1
z; % z-values 9x1
X = [x y];
Y = z;
fitted_model = fit(X, Y, 'poly22')
If you don't have the toolbox, you can still use mldivide (\) to do least square curve-fitting. For example, suppose you want to fit following model Then you can do something like this
X = [ones(size(x)) x y x.^2 y.^2 x.*y];
Y = z;
a = X\Y;

Ameer Hamza on 30 Oct 2020
This code shows how to use the fitted_model to draw the surface
Flow_1 = [760 980 1245] % l/min
rpm = [1550 2730 3650]
Ra_1f = [10.65366667 9.462 10.266; 13.73666667 14.53466667 12.15333333; 12.725 11.236 13.26933333];
x = Flow_1;
y = rpm;
z = [Ra_1f(:,1)'; Ra_1f(:,2)'; Ra_1f(:,end)'];
[xg, yg] = meshgrid(x,y); % Plot of points
xg = xg(:);
yg = yg(:);
zg = z(:);
fitted_model = fit([xg yg], zg, 'poly22');
xlin = linspace(min(x),max(x),33);
ylin = linspace(min(y),max(y),33);
[X, Y] = meshgrid(xlin,ylin);
Z = fitted_model([X(:) Y(:)]);
Z = reshape(Z, size(X));
mesh(X,Y,Z) %interpolated
axis tight; hold on
xlabel('Air-flow Rate (l/min)')
ylabel('Motor Speed (rpm)')
zlabel('Surface Roughness (µm)')
plot3(M,N,z,'.','MarkerSize',20)
legend('','760 l/min','980 l/min','1245 l/min' )
title('Test 1: Final Ra')
colorbar;
hold off
Muhammad Hamza Saloojee on 30 Oct 2020
This is perfect.
Thank you so much for the assistance!
Much appreciated.
Ameer Hamza on 31 Oct 2020 at 9:08
I am glad to be of help!