# How can I determine the equation of the best-fit line, plane, or N-D surface using MATLAB?

74 views (last 30 days)

Show older comments

MathWorks Support Team
on 10 Sep 2012

Edited: MathWorks Support Team
on 17 Feb 2021

### Accepted Answer

MathWorks Support Team
on 17 Feb 2021

Edited: MathWorks Support Team
on 17 Feb 2021

Fitting surfaces to data can be performed both interactively and programmatically using Curve Fitting Toolbox 2.0 (R2009a). For more information on surface fitting in Curve Fitting Toolbox 2.0 (R2009a), refer the following online documentation:

For previous versions of MATLAB, try the following workarounds:

To fit a line, plane, or higher-dimensional surface to a set of data using MATLAB, use the backslash operator. The first example listed below shows how to determine the best-fit line for two-dimensional data; the second demonstrates how to fit a plane to three-dimensional data.

Example 1: Fitting a best-fit line to data

% Fitting a best-fit line to data, both noisy and non-noisy

x = rand(1,10);

n = rand(size(x)); % Noise

y = 2*x + 3; % x and y satisfy y = 2*x + 3

yn = y + n; % x and yn roughly satisfy yn = 2*x + 3 due to the noise

% Determine coefficients for non-noisy line y=m1*x+b1

Xcolv = x(:); % Make X a column vector

Ycolv = y(:); % Make Y a column vector

Const = ones(size(Xcolv)); % Vector of ones for constant term

Coeffs = [Xcolv Const]\Ycolv; % Find the coefficients

m1 = Coeffs(1);

b1 = Coeffs(2);

% To fit another function to this data, simply change the first

% matrix on the line defining Coeffs

% For example, this code would fit a quadratic

% y = Coeffs(1)*x^2+Coeffs(2)*x+Coeffs(3)

% Coeffs = [Xcolv.^2 Xcolv Const]\Ycolv;

% Note the .^ before the exponent of the first term

% Plot the original points and the fitted curve

figure

plot(x,y,'ro')

hold on

x2 = 0:0.01:1;

y2 = m1*x2+b1; % Evaluate fitted curve at many points

plot(x2, y2, 'g-')

title(sprintf('Non-noisy data: y=%f*x+%f',m1,b1))

% Determine coefficients for noisy line yn=m2*x+b2

Xcolv = x(:); % Make X a column vector

Yncolv = yn(:); % Make Yn a column vector

Const = ones(size(Xcolv)); % Vector of ones for constant term

NoisyCoeffs = [Xcolv Const]\Yncolv; % Find the coefficients

m2 = NoisyCoeffs(1);

b2 = NoisyCoeffs(2);

% Plot the original points and the fitted curve

figure

plot(x,yn,'ro')

hold on

x2 = 0:0.01:1;

yn2 = m2*x2+b2;

plot(x2, yn2, 'g-')

title(sprintf('Noisy data: y=%f*x+%f',m2,b2))

Example 2: Fitting a plane to data

x = rand(1,10);

y = rand(1,10);

z = (3-2*x-5*y)/4; % Equation of the plane containing

% (x,y,z) points is 2*x+5*y+4*z=3

Xcolv = x(:); % Make X a column vector

Ycolv = y(:); % Make Y a column vector

Zcolv = z(:); % Make Z a column vector

Const = ones(size(Xcolv)); % Vector of ones for constant term

Coefficients = [Xcolv Ycolv Const]\Zcolv; % Find the coefficients

XCoeff = Coefficients(1); % X coefficient

YCoeff = Coefficients(2); % X coefficient

CCoeff = Coefficients(3); % constant term

% Using the above variables, z = XCoeff * x + YCoeff * y + CCoeff

L=plot3(x,y,z,'ro'); % Plot the original data points

set(L,'Markersize',2*get(L,'Markersize')) % Making the circle markers larger

set(L,'Markerfacecolor','r') % Filling in the markers

hold on

[xx, yy]=meshgrid(0:0.1:1,0:0.1:1); % Generating a regular grid for plotting

zz = XCoeff * xx + YCoeff * yy + CCoeff;

surf(xx,yy,zz) % Plotting the surface

title(sprintf('Plotting plane z=(%f)*x+(%f)*y+(%f)',XCoeff, YCoeff, CCoeff))

% By rotating the surface, you can see that the points lie on the plane

% Also, if you multiply both sides of the equation in the title by 4,

% you get the equation in the comment on the third line of this example

The syntax used in these two examples generalizes to higher dimensions and higher order polynomials, by assembling the data matrices and using the backslash operator as shown on the lines labelled "Find the coefficients". This is successful as long as the data matrices are linear in powers of the independent variables.

For information on N-dimensional curve fitting tools, see the demos in the documentation for the following products:

Curve Fitting Toolbox:

http://www.mathworks.com/help/toolbox/curvefit/curvefit_product_page.html

Statistics Toolbox:

http://www.mathworks.com/access/helpdesk/help/toolbox/stats/

##### 0 Comments

### More Answers (0)

### See Also

### Categories

### Products

### Community Treasure Hunt

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

Start Hunting!