[Scilab-users] Fitting correlations to measured data. Write-ups of leastsq is messy ...
Dang Ngoc Chan, Christophe
Christophe.Dang at sidel.com
Fri Jan 31 09:59:04 CET 2020
Hello,
> De : Heinz Nabielek
> Envoyé : jeudi 30 janvier 2020 23:25
>
> First: linear least-squares fitting: with measurement data x=[2 7 12]'; y=[2 4.5
> 6.5]'; it is easy, to fit a straight line and plot it:
> M=[ones(x) x]; a=M\y; plot2d(x,M*a); plot(x,y,'r.');
> [...]
> In my case, I wanted to simultaneously fit three straight lines through three
> measurement series with the condition that all 3 lines start at the same point
> on the x-axis. So the following worked well for me:
>
> x=[2 7 12]'; y=[2 4.5 6.5]'; y1=[1 2 3]'; y2=[0 1 1.4]'; par0 = [.5 .15 .09 -5];
> function e=err(par, x,y,y1,y2)
> e= [y-par(1)*(x+par(4)); y1-par(2)*(x+par(4)); y2-par(3)*(x+par(4))]
> endfunction
>
> [f,paropt] = leastsq ( list(err,x,y,y1,y2), par0);
For this specific case, you might consider this:
You can use a linear law that goes through zero with a linear regression just by removing the column of ones:
A = x\y
You can thus improve the speed by a factor 8 :
----------
x=[2 7 12]';
y=[2 4.5 6.5]';
y1=[1 2 3]';
y2=[0 1 1.4]';
par0 = [.5 .15 .09 -5];
par01 = -5;
function e=err(par, x,y,y1,y2)
e= [y-par(1)*(x+par(4)); y1-par(2)*(x+par(4)); y2-par(3)*(x+par(4))]
endfunction
function e=err1(par, x,y,y1,y2)
A = (x + par)\y;
A1 = (x + par)\y1;
A2 = (x + par)\y2;
e= [y-A*(x+par); y1-A1*(x+par); y2-A2*(x+par)]
endfunction
tic();
[f,paropt] = leastsq ( list(err,x,y,y1,y2), par0);
t1=toc();
figure(0);
clf();
plot(x,[y y1 y2],'.');
xx=[5, 15];
plot(xx,paropt(1)*(xx+paropt(4)),'b--');
plot(xx,paropt(2)*(xx+paropt(4)),'g--');
plot(xx,paropt(3)*(xx+paropt(4)),'r--');
tic();
[f,paropt1] = leastsq ( list(err1,x,y,y1,y2), par01);
A = (x+paropt1)\y;
A1 = (x+paropt1)\y1;
A2 = (x+paropt1)\y2;
t2=toc();
figure(1);
clf();
plot(x,[y y1 y2],'.');
xx=[5, 15];
plot(xx,A.*(xx+paropt1),'b--');
plot(xx,A1.*(xx+paropt1),'g--');
plot(xx,A2.*(xx+paropt1),'r--');
disp("t1 = " + string(t1) + " ; t2 = " + string(t2) +...
" ; t1/t2 = " + string(t1/t2));
----------
--
Christophe Dang Ngoc Chan
Mechanical calculation engineer
General
This e-mail may contain confidential and/or privileged information. If you are not the intended recipient (or have received this e-mail in error), please notify the sender immediately and destroy this e-mail. Any unauthorized copying, disclosure or distribution of the material in this e-mail is strictly forbidden.
More information about the users
mailing list