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.
		
			
				
	
	
		
			169 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Matlab
		
	
	
	
	
	
			
		
		
	
	
			169 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Matlab
		
	
	
	
	
	
| function bicycle = bicycle_state_space(bicycle, speed, varargin)
 | |
| % function bicycle = bicycle_state_space(bicycle, speed, varargin)
 | |
| %
 | |
| % Returns the state space system of the Whipple model linearized about the
 | |
| % nominal configuration and the supplied speed.
 | |
| %
 | |
| % Parameters
 | |
| % ----------
 | |
| % bicycle : char
 | |
| %   The name of a bicycle in the parameters directory.
 | |
| % speed : double
 | |
| %   The forward speed at which to linearize the model about.
 | |
| % varargin : char/cell array pairs, optional
 | |
| %   Specify a subset of states, inputs or outputs by setting one of the
 | |
| %   following: `states`, `inputs`, `outputs` as a cell array of
 | |
| %   chars which include the subset variable names. Beaware that not all
 | |
| %   state, input and output combinations are necessarily possible.
 | |
| %   Valid state names: 'xP', 'yP', 'psi', 'phi', 'thetaB', 'thetaR', 'delta',
 | |
| %       'thetaF', 'phiDot', 'thetaRDot', 'deltaDot'
 | |
| %   Valid input names: 'tPhi', 'tDelta', 'fB'
 | |
| %   Valid output names: 'xP', 'yP', 'psi', 'phi', 'thetaB', 'thetaR', 'delta',
 | |
| %       'thetaF', 'xPDot', 'yPDot', 'psiDot', 'phiDot', 'thetaBDot',
 | |
| %       'thetaRDot', 'deltaDot', 'thetaFDot', 'xQ', 'yQ'
 | |
| %
 | |
| % Returns
 | |
| % -------
 | |
| % bicycle : ss
 | |
| %   The state space model of the bicycle.
 | |
| %
 | |
| % Notes
 | |
| % -----
 | |
| % The variable names are defined as in Meijaard2007.
 | |
| %
 | |
| % Examples
 | |
| % --------
 | |
| % bicycle = bicycle_state_space('Benchmark', 5.0, ...
 | |
| %   'states', {'phi', 'phiDot', 'delta', 'deltaDot'}, ...
 | |
| %   'inputs', {'tDelta'}, ...
 | |
| %   'outputs', {'delta', 'phi'})
 | |
| 
 | |
| % get the directory which this m-file is in
 | |
| S = dbstack('-completenames');
 | |
| [CURRENT_DIRECTORY, ~, ~] = fileparts(S(1).file);
 | |
| 
 | |
| % load the paramaters
 | |
| par = par_text_to_struct([CURRENT_DIRECTORY filesep 'parameters' ...
 | |
|     filesep bicycle 'Par.txt']);
 | |
| 
 | |
| % generate the state space matrices
 | |
| [A, B, C, D] = whipple_pull_force_abcd(par, speed);
 | |
| 
 | |
| % name the states, outputs and inputs
 | |
| states = {'xP',
 | |
|           'yP',
 | |
|           'psi',
 | |
|           'phi',
 | |
|           'thetaB',
 | |
|           'thetaR',
 | |
|           'delta',
 | |
|           'thetaF',
 | |
|           'phiDot',
 | |
|           'thetaRDot',
 | |
|           'deltaDot'};
 | |
| 
 | |
| outputs = {'xP',
 | |
|            'yP',
 | |
|            'psi',
 | |
|            'phi',
 | |
|            'thetaB',
 | |
|            'thetaR',
 | |
|            'delta',
 | |
|            'thetaF',
 | |
|            'xPDot',
 | |
|            'yPDot',
 | |
|            'psiDot',
 | |
|            'phiDot',
 | |
|            'thetaBDot',
 | |
|            'thetaRDot',
 | |
|            'deltaDot',
 | |
|            'thetaFDot',
 | |
|            'xQ',
 | |
|            'yQ'};
 | |
| 
 | |
| inputs = {'tPhi',
 | |
|           'tDelta',
 | |
|           'fB'};
 | |
| 
 | |
| defaultSettings.states = states;
 | |
| defaultSettings.inputs = inputs;
 | |
| defaultSettings.outputs = outputs;
 | |
| % load in user supplied settings
 | |
| if size(varargin, 2) >= 1
 | |
|     userSettings = varargin_to_structure(varargin);
 | |
| else
 | |
|     userSettings = struct();
 | |
| end
 | |
| % combine the defaults with the user settings
 | |
| settings = overwrite_settings(defaultSettings, userSettings);
 | |
| 
 | |
| % Will the system have the bare minimum states?
 | |
| minStates = {'phi', 'delta', 'phiDot', 'deltaDot'};
 | |
| if sum(ismember(settings.states, minStates)) < 4
 | |
|     error(['You have not specified the minimum set of states. Please ' ...
 | |
|         'include at least phi, delta, phiDot, and deltaDot'])
 | |
| end
 | |
| 
 | |
| % Have state derivatives been specified that can't be computed with the
 | |
| % specified states?
 | |
| keepStates = find(ismember(states, settings.states));
 | |
| removeStates = find(~ismember(states, settings.states));
 | |
| for row = keepStates'
 | |
|     for col = removeStates'
 | |
|         if abs(A(row, col)) > 1e-10
 | |
|             s = sprintf(['It is not possible to compute the derivative ' ...
 | |
|                 'of state %s because it depends on state %s'], ...
 | |
|                 states{row}, states{col});
 | |
|             error(s)
 | |
|         end
 | |
|     end
 | |
| end
 | |
| 
 | |
| removeInputs = find(~ismember(inputs, settings.inputs));
 | |
| 
 | |
| % Have outputs been specified that can't be computed with the specified
 | |
| % states and inputs?
 | |
| keepOutputs = find(ismember(outputs, settings.outputs));
 | |
| for row = keepOutputs'
 | |
|     for col = removeStates'
 | |
|         if abs(C(row, col)) > 1e-10
 | |
|             s = sprintf(['It is not possible to keep output %s because ' ...
 | |
|                 'it depends on state %s'], outputs{row}, ...
 | |
|                 states{col});
 | |
|             error(s)
 | |
|         end
 | |
|     end
 | |
|     for col = removeInputs'
 | |
|         if abs(D(row, col)) > 1e-10
 | |
|             s = sprintf(['It is not possible to keep output %s because ' ...
 | |
|                 'it depends on input %s'], outputs{row}, ...
 | |
|                 inputs{col});
 | |
|             error(s)
 | |
|         end
 | |
|     end
 | |
| end
 | |
| 
 | |
| removeOutputs = find(~ismember(outputs, settings.outputs));
 | |
| 
 | |
| A(removeStates, :) = [];
 | |
| A(:, removeStates) = [];
 | |
| 
 | |
| B(removeStates, :) = [];
 | |
| B(:, removeInputs) = [];
 | |
| 
 | |
| C(removeOutputs, :) = [];
 | |
| C(:, removeStates) = [];
 | |
| 
 | |
| D(removeOutputs, :) = [];
 | |
| D(:, removeInputs) = [];
 | |
| 
 | |
| states(removeStates) = [];
 | |
| inputs(removeInputs) = [];
 | |
| outputs(removeOutputs) = [];
 | |
| 
 | |
| % build the ss structure
 | |
| bicycle = ss(A, B, C, D, ...
 | |
|              'StateName', states, ...
 | |
|              'OutputName', outputs, ...
 | |
|              'InputName', inputs);
 |