MATLAB Answers

3D - Surface Response Plot - Surface of best fit

14 views (last 30 days)
Muhammad Hamza Saloojee
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.


Sign in to comment.

Accepted Answer

Ameer Hamza
Ameer Hamza on 30 Oct 2020
Edited: Ameer Hamza on 30 Oct 2020
If you have a curve fitting toolbox, you can use fit(): function with fitype chosen from polyij as given here: 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;


Show 8 older comments
Ameer Hamza
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)')
legend('','760 l/min','980 l/min','1245 l/min' )
title('Test 1: Final Ra')
hold off
Muhammad Hamza Saloojee
Muhammad Hamza Saloojee on 30 Oct 2020
This is perfect.
Thank you so much for the assistance!
Much appreciated.

Sign in to comment.

More Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by