mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +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
 |