mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 09:40:21 +00:00
All of these code samples currently are mis-identified in my repositories. I'm donating them to the cause.
87 lines
3.4 KiB
Matlab
87 lines
3.4 KiB
Matlab
% This file identifies a series of models for a time varying plant.
|
|
|
|
% k1, k2, k3, k4, tau, zetanm, wnm, zetafs, wfs
|
|
|
|
%data = load_data('jason_adapt.mat');
|
|
%filename = 'adapt';
|
|
%guess.plantOne = [4.85, 1.79, 20, 20, 0.2, 0.707, 10, 0.707, 65];
|
|
%guess.plantTwo = [3.36, 9.49, 20, 0, 0.2, 0.707, 10, 0.707, 65];
|
|
%plantNum.plantOne = 1;
|
|
%plantNum.plantTwo = 5;
|
|
|
|
data = load_data('adapt_hard.mat');
|
|
filename = 'hard-adapt';
|
|
guess.plantOne = [1.23, 0.354, 0.2, 20.0, 0.2, 0.707, 10, 0.707, 65];
|
|
guess.plantTwo = [4.85, 1.79, 20, 20, 0.2, 0.707, 10, 0.707, 65];
|
|
plantNum.plantOne = 6;
|
|
plantNum.plantTwo = 1;
|
|
|
|
t = [0, 30, 40, 50, 60, 90];
|
|
|
|
sections = {'plantOne', 'adaptOne', 'adaptTwo', 'adaptThree', 'plantTwo'};
|
|
for i = 1:length(sections)
|
|
secData.(sections{i}) = data(t(i) / data.Ts + 1:t(i + 1) / data.Ts);
|
|
end
|
|
|
|
% compute the slope and offset for each gain for initial guesses
|
|
kP1 = guess.plantOne(1:4)';
|
|
kP2 = guess.plantTwo(1:4)';
|
|
gainSlopeOffset = [t(2) * eye(4), eye(4); t(5) * eye(4), eye(4)] \ [kP1; kP2];
|
|
m = gainSlopeOffset(1:4);
|
|
b = gainSlopeOffset(5:8);
|
|
|
|
for i = 1:length(sections)
|
|
|
|
if strcmp(sections{i}, sections{1}) || strcmp(sections{i}, sections{end})
|
|
display('boo')
|
|
else
|
|
if i > 1
|
|
% use the best fit gains from the previous section
|
|
guess.(sections{i}) = result.(sections{i - 1}).fit.par;
|
|
else
|
|
currentGuess = m .* (t(i) + t(i + 1)) / 2 + b;
|
|
guess.(sections{i}) = [currentGuess', guess.plantOne(5:end)];
|
|
end
|
|
percent = ((t(i) + t(i + 1)) / 2 - t(2)) / (t(5) - t(2));
|
|
plantNum.(sections{i}) = {plantNum.plantOne, plantNum.plantTwo, percent};
|
|
end
|
|
|
|
result.(sections{i}) = find_structural_gains(secData.(sections{i}), ...
|
|
guess.(sections{i}), plantNum.(sections{i}), 'warning', false, ...
|
|
'randomGuess', true);
|
|
|
|
[yh, vaf, x0] = compare(secData.(sections{i}), result.(sections{i}).fit);
|
|
result.(sections{i}).vaf = vaf(1, 1, 1);
|
|
display(sprintf('The self validation VAF is %f.', vaf(1, 1, 1)))
|
|
|
|
p = plantNum.(sections{i});
|
|
if size(plantNum.(sections{i}), 2) > 1
|
|
result.(sections{i}).plant = plant(p{:});
|
|
else
|
|
result.(sections{i}).plant = plant(p);
|
|
end
|
|
end
|
|
|
|
save(['data/' filename '-results.mat'], 'sections', 'guess', 'plantNum', 'result')
|
|
|
|
for i = 1:length(sections)
|
|
result.(sections{i}).fig = figure;
|
|
compare(secData.(sections{i}), result.(sections{i}).fit);
|
|
saveas(result.(sections{i}).fig, ['plots/' filename '-' sections{i} '.png'])
|
|
[yh, fit, x0] = compare(secData.(sections{i}), result.(sections{i}).fit);
|
|
display('-----------------')
|
|
display('The task plant is:')
|
|
display(result.(sections{i}).plant)
|
|
display(sprintf('The order of the closed loop system is %u.', ...
|
|
size(result.(sections{i}).mod.A, 1)))
|
|
display(sprintf('The gain guesses: k1=%f, k2=%f, k3=%f, k4=%f', ...
|
|
result.(sections{i}).mod.par(1:4)))
|
|
display(sprintf('The identified gains: k1=%f+\\-%f, k2=%f+\\-%f, k3=%f+\\-%f, k4=%f+\\-%f', ...
|
|
result.(sections{i}).fit.par(1), result.(sections{i}).uncert(1), ...
|
|
result.(sections{i}).fit.par(2), result.(sections{i}).uncert(2), ...
|
|
result.(sections{i}).fit.par(3), result.(sections{i}).uncert(3), ...
|
|
result.(sections{i}).fit.par(4), result.(sections{i}).uncert(4)))
|
|
display(sprintf('The self validation VAF is %f.', ...
|
|
result.(sections{i}).vaf))
|
|
end
|