The code below generates data similar to experimental data. However, the curve fit does not appear to locate the knot point. Any suggestions?
function bilinearfitclose all; clc;% Random coeffs
al = -rand*20;ah = rand/10;bl = (rand-0.5)*20;isxnrand = 1;if isxnrand xn = rand*8+2; bh = xn * (al - ah) + bl;else bh = (rand-0.5)*20; xn = (bh - bl) / (al - ah);end% Random data...
xdata = linspace(2,10,101);blfit = @(coeff, x) ( x < coeff(1) ) .* (coeff(2) * x + coeff(3)) ... + (~( x < coeff(1) )) .* (coeff(4) * x + coeff(5));coeffNoise = ((rand(1,5)-0.5)*2/100+1);coeff0 = [xn al bl ah bh] .* coeffNoise;ydata = blfit(coeff0, xdata);dataNoise = (rand(size(ydata))-0.5)*2/100+1;ydata = ydata .* dataNoise;plot(xdata,ydata,'ko')% F = @(B,xdata) min(B(1),B(2)+B(3)*xdata); %Form of the equation
F = @(coeff)(blfit(coeff,xdata));IC = [1 1 1 1 1]; %Initial guess
LB = [min(xdata) -inf -inf -inf -inf];UB = [max(xdata) inf inf inf inf];B = lsqcurvefit( blfit,IC,xdata,ydata,LB,UB);hold all;plot(xdata,blfit(B,xdata),'r--');end
Best Answer