Need help with a least squares method fitting.

3 views (last 30 days)
I am doing a final project for a class and the first part is about fitting a 2nd and 6th order polynomials to some data using the least squares method. The catch is the general linear least squares method cannot be used, i.e. {y}=[Z]{a}+{e}.
clear all;
clc;
load('data')
x = [t]';
y = [r]';
N=[14400 sum(x) sum(x.^2);sum(x) sum(x.^2) sum(x.^3);sum(x.^2) sum(x.^3) sum(x.^4)];
q=[sum(y) sum(x.*y) sum(x.^2.*y)];
a=N/q
%Polyfit Check to compare
x=[t]';
y=[r]';
b=polyfit(x,y,2)
fprintf('The data is fit as y=(%.4f)+(%.4f)(x)+(%.4f)x^2\n\n',b(1),b(2),b(3));
And the results I get do not match up.
a =
1.0e+04 *
0.0000
0.0001
1.5963
b =
1.0e+03 *
-0.0000 0.0001 8.0980
The data is fit as y=(-0.0000)+(0.1205)(x)+(8098.0146)x^2
I don't know exactly what I am doing wrong. The number 14400 is in there because the data is two 14401 X 1 doubles. I have also attached the data. Thanks in advance

Answers (1)

James Tursa
James Tursa on 7 Nov 2017
Edited: James Tursa on 7 Nov 2017
The least squares equations you are trying to solve, using your variable names, are
N * a = q'
So do this instead (where the transpose is simply to turn q into a column vector):
a = N \ q';
Then you can see how they match up (the fliplr stuff is just to get the numbers to line up for output):
>> fliplr((N\q')')
ans =
1.0e+003 *
-0.000000012897721 0.000120497278334 8.098014646584689
>> polyfit(x,y,2)
ans =
1.0e+003 *
-0.000000012897721 0.000120497278334 8.098014646584003

Categories

Find more on Creating and Concatenating Matrices 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!