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
 |