This is not going to be your ordinary question, but hopefully somebody can assist me. I want to take a function of data points, for instance a random set of points ("rnpi" in my code), and fit it to an upper and lower bounding function, such as a pair of sine waves (AS1 and AS2 in my code). The data point locations will be distorted by the waves, so that a straight line will come out curvy, etc. I am including a diagram showing what I want. How do I do this? iP = [0, 88]; iB = [30, 74]; npi = 200; % SHOULD BE EQUAL TO LENGTH OF RANDOM PATTERN BELOW aa1 = iP(1); % MIN OF RANGE aa2 = iP(2); % MAX OF RANGE ab1 = iB(1); % MIN OF RANGE ab2 = iB(2); % MAX OF RANGE nz1 = 0:pi/npi:4*pi; nz2 = pi + (0:pi/npi:4*pi); nr1 = 3/2; % NUMBER OF REPEATS /2 nr2 = 5/2; % NUMBER OF REPEATS /2 AS1 = (1 + cos(pi + nz1*nr1))/2; % 0-1 AS1 = aa1 + (ab1 * AS1); % aa1-ab1 AS2 = (1 + cos((pi*nr2)-(nz2*nr2)))/2; % 0-1 AS2 = ab2 + ((aa2-ab2) * AS2); % ab1-ab2 plot(AS1) hold on plot(AS2) hold off % NOW TEST WITH A RANDOM PATTERN rnpi = round(88 * rand(npi,1)); % THE REST GOES HERE.....................
Prashant Kumar answered .
2025-11-20
ULim = [74 88]; LLim = [0 30]; XLim = [0 2*pi]; x = linspace(XLim(1),XLim(2)); UpperFcn = @(x) (cos(x)+1)/2*diff(ULim) + ULim(1); LowerFcn = @(x) (1-(cos(x))/2)*diff(LLim) + LLim(1); fplot(UpperFcn,XLim) hold on fplot(LowerFcn,XLim)
Now just create an interpolated function that trades off the two boundaries.
TFcn = @(x) (x-XLim(1))./diff(XLim); MidFcn = @(x) (1-TFcn(x)).*UpperFcn(x) + TFcn(x).*LowerFcn(x); fplot(MidFcn,XLim)