MATLAB: Wich is the good soulution My vs. School – curve fitting

curve fittingleast squaresMATLABnonlinear

Hy, I wonder wich is the good solution for this problem:
Nonlinear least square problem: function: y = x / (a + b.x) linearization: 1/y = a/x + b substitution: v = 1/y , u = 1/x >> model v = b + a.u
What we did in school:
x = [1 2 4 7]; y = [2 1 0.4 0.1];
v=1./y;
u=1./x;
n = length(x);
A=[ones(n,1), u']
xbeta=A\v'
Lbeta=xbeta;
beta0=flipud(Lbeta)
beta=fminsearch('kritfun',beta0)
r = [kritfun(beta0) , kritfun(beta)]
+ kritfun.m
function z=kritfun(beta)
a=beta(1);
b=beta(2);
x = [1 2 4 7];
y = [2 1 0.4 0.1];
error = y - x./(a + b*x );
z = sum((error .^2 ));
ML: xbeta =
7.3658
-8.1692
beta =
1.0e+014 *
-8.2085
4.1043
r =
11.0600 4.1700
but when I try in Curve Fitting tool too check the soulution , I get something else ..according to this video: youtube turtorial video too call CF I typed to prompt >>cftool
When I try this I get the same number like in the Curve fitting tool , the a,b parameters is my beta(1),beta(2) and the SSE number is my r(2) ..what was same when I tried this:
x = [1 2 4 7];
y = [2 1 0.4 0.1];
%u = 1./x; %these u and v I dont use it...but I didnt know when not using substituion is correct the beta and r(2) , but when I didnt use I get same numbers lik in the Curve Fitting tool
%v = 1./y;
n = length(x);
X = [ ones(n,1), x'];
btr = X\y'
beta0 = flipud(btr)'
beta = fminsearch('mnsNLcFUN',beta0)
r = [mnsNLcFUN(beta0), mnsNLcFUN(beta)]
+ mnsNLcFUN.m function is:
function z=mnsNLcFUN(beta)
a=beta(1);
b=beta(2);
x = [1 2 4 7];
y = [2 1 0.4 0.1];
error = y - x./(a+b.*x);
z = sum((error .^2 ));

Best Answer

Don’t linearise! It distorts the errors and results in inaccurate parameter estimates.
Using fminsearch gives a decent fit to the data:
x = [1 2 4 7];
y = [2 1 0.4 0.1];
fy = @(b,x) x./(b(1) + b(2).*x);
CF = @(b) sum((y-fy(b,x)).^2);
[b, fv] = fminsearch(CF, [1;1])
figure(1)
plot(x, y, '*r')
hold on
plot(x, fy(b,x), '-b')
hold off
producing the parameter estimates:
b =
-2.0553e+000
2.5517e+000
where a=b(1) and b=b(2).
Related Question