function adjusted = adjustParams( lower, param, upper, skewawareness ) % Hedderik van Rijn, 001220 % % This function calculates new, adjusted param's by sampling from a normal % distribution with a mean of param(i) and a SD of 1/6th of the range of the % parameter. (Effectively causing to be +- 95% of the observation to be % within the lower/upper range.) % % if skewawareness == []: % % NOTE: This function performs remarkably poor if (param(i) - lower(i)) is % not approximately equal to (upper(i) - param(i)). % % if skewawareness ~= []: % % NOTE: The function tries to emulate some sort of skewness-awareness by % using different sample distributions for the decreasing and increasing % adjustments. These different distributions are defined by having a SD % equal to 1/3rd of the difference between the limit and the parameter % itself. % % !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! % % LET OP: Er is iets raars aan de hand als de uppers, lowers en param niet % juist verdeeld zijn, ie., niet lowers < param < uppers. De functie lijkt % dan altijd de upper (?) te geven. % % HvR, 010406 if (nargin == 3) skewawareness = 0; else skewawareness = 1; end lvec = length(param); adjusted = zeros(1,lvec); if ((length(lower) ~= lvec) | (length(upper) ~= lvec)) error 'Length of input vectors are not equal' end for i = 1:lvec if (not ((lower(i) == param(i)) & (upper(i) == param(i)))) if (lower(i) == param(i)) adjusted(i) = param(i) + abs(random('norm',0,(upper(i)-param(i))/3)); elseif (upper(i) == param(i)) adjusted(i) = param(i) - abs(random('norm',0,(param(i)-lower(i))/3)); elseif (skewawareness) if (random('unif',-1,1) >= 0) adjusted(i) = param(i) + abs(random('norm',0,(upper(i)-param(i))/3)); else adjusted(i) = param(i) - abs(random('norm',0,(param(i)-lower(i))/3)); end else adjusted(i) = random('norm',param(i),(upper(i)-lower(i))/6); end adjusted(i) = max(adjusted(i),lower(i)); adjusted(i) = min(adjusted(i),upper(i)); else adjusted(i) = param(i); end end