📄 medfit.pas
字号:
PROCEDURE medfit(x,y: glndata; ndata: integer; VAR a,b,abdev: real);
(* Programs using routine MEDFIT must define the type
TYPE
glndata = ARRAY [1..ndata] OF real;
in the main routine. MEDFIT also assumes that the instructions
at the beginning of ROFUNC have been carried out so that arrays
x,y and arr, and real variables aa and abdevt exist as globally
defined variables. *)
LABEL 3;
VAR
j: integer;
sy,sxy,sxx,sx,sigb,f2,f1,f: real;
del,chisq,bb,b2,b1: real;
BEGIN
sx := 0.0;
sy := 0.0;
sxy := 0.0;
sxx := 0.0;
FOR j := 1 TO ndata DO BEGIN
sx := sx+x[j];
sy := sy+y[j];
sxy := sxy+x[j]*y[j];
sxx := sxx+sqr(x[j])
END;
del := ndata*sxx-sx*sx;
aa := (sxx*sy-sx*sxy)/del;
bb := (ndata*sxy-sx*sy)/del;
chisq := 0.0;
FOR j := 1 TO ndata DO BEGIN
chisq := chisq+sqr(y[j]-(aa+bb*x[j]))
END;
sigb := sqrt(chisq/del);
b1 := bb;
f1 := rofunc(b1);
IF (f1 > 0.0) THEN BEGIN
b2 := bb+abs(3.0*sigb)
END ELSE BEGIN
b2 := bb-abs(3.0*sigb)
END;
f2 := rofunc(b2);
WHILE ((f1*f2) > 0.0) DO BEGIN
bb := 2.0*b2-b1;
b1 := b2;
f1 := f2;
b2 := bb;
f2 := rofunc(b2)
END;
sigb := 0.01*sigb;
WHILE (abs(b2-b1) > sigb) DO BEGIN
bb := 0.5*(b1+b2);
IF ((bb = b1) OR (bb = b2)) THEN GOTO 3;
f := rofunc(bb);
IF ((f*f1) >= 0.0) THEN BEGIN
f1 := f;
b1 := bb
END ELSE BEGIN
f2 := f;
b2 := bb
END
END;
3: a := aa;
b := bb;
abdev := abdevt/ndata
END;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -