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);
 |