Fitting Parameters of Polynomials to Data
function StructureIdentificationExample(n, TrainingStart, TrainingEnd, ...
TestStart, TestEnd, NoiseRange)
%Creates training and test data for the specified ranges:
%- One input X, one output Y.
%- Y = X^3 - 100X + 100 + noise
%- Uniformly distributed noise is added
%A polynomial modeling approach is executed for order n; parameters are fit
%to training data using the right matrix division command.
%Results are displayed graphically including model quality information (MSE).
% -- preparations -----------
if nargin<6, NoiseRange = 500, end;
if nargin<5, TestEnd = 25, end;
if nargin<4, TestStart = 6, end;
if nargin<3, TrainingEnd = 5, end;
if nargin<2, TrainingStart = -15, end;
if nargin<1, n = 5, end;
rand('state',12345);
X = TrainingStart:TrainingEnd;
for i=1:length(X)
Y(i,1) = X(i)^3 - 100*X(i) + 100;
Y_(i,1) = rand(1)*NoiseRange - NoiseRange/2;
Y(i,1) = Y(i,1) + Y_(i,1);
end
Z = zeros(length(X), n+1);
for j = 1 : (n+1)
for i=1:length(X)
Z(i,j) = X(i)^(j-1);
end
end
Y = Y'; Z = Z';
x = TrainingStart:0.01:TrainingEnd;
z = zeros(length(x), n+1);
for j = 1 : (n+1)
for i=1:length(x)
z(i,j) = x(i)^(j-1);
end
end
z = z';
% -- training -----------
poly = Y/Z;
Yhat = poly*Z; error = Yhat-Y;
mse = sum(error.*error)/length(Y)
y = poly*z;
figure
plot(X,Y,'s', 'MarkerEdgeColor','k', 'MarkerFaceColor','k', 'MarkerSize',5)
hold on;
plot(x,y,'k', 'LineWidth',2);
hold off; grid on;
titlestr = ['Order ' num2str(n) ', MSE (training): ' num2str(mse)];
title(titlestr);
% -- test -----------
Xtest = TestStart:TestEnd;
for i=1:length(Xtest)
Ytest(i,1) = Xtest(i)*Xtest(i)*Xtest(i) - 100*Xtest(i) + 100;
Ytest_(i,1) = rand(1)*NoiseRange - NoiseRange/2;
Ytest(i,1) = Ytest(i,1) + Ytest_(i,1);
end
Ztest = zeros(length(Xtest), n+1);
for j = 1 : (n+1)
for i=1:length(Xtest)
Ztest(i,j) = Xtest(i)^(j-1);
end
end
Ytest = Ytest'; Ztest = Ztest';
YhatTest = poly*Ztest;
errorTest = YhatTest-Ytest;
mseTest = sum(errorTest.*errorTest)/length(YhatTest)
x = TrainingStart:0.01:TestEnd;
z = zeros(length(x), n+1);
for j = 1 : (n+1)
for i=1:length(x)
z(i,j) = x(i)^(j-1);
end
end
z = z';
y = poly*z;
figure
plot([X Xtest],[Y Ytest],'s', 'MarkerEdgeColor','k', ...
'MarkerFaceColor','k', 'MarkerSize',5)
hold on;
plot(x,y,'k', 'LineWidth',2);
hold off; grid on;
titlestr = ['Order ' num2str(n) ', MSE (test): ' num2str(mseTest)];
title(titlestr);