Procedure SVDFIT(X,Y,SIG:array of real; NDATA:integer;var A:array of real; MA:integer;var U, V:matrx2;var W:array of real; MP, NP:integer;var CHISQ:real; FUNCS:string); var B:array[0..1000] of real; AFUNC:array[0..50] of real; I,J:integer; TMP,WMAX,THRESH,SUM1:real; const TOL=0.00001; begin For I:=1 To NDATA do begin If FUNCS = 'FPOLY' Then FPOLY(X[I], AFUNC, MA); If FUNCS = 'FLEG' Then FLEG(X[I], AFUNC, MA); TMP:=1 / SIG[I]; For J:=1 To MA do U[I, J]:=AFUNC[J] * TMP; B[I]:=Y[I] * TMP; end; SVDCMP(U, NDATA, MA, W, V); WMAX:=0; For J:=1 To MA do If W[J] > WMAX Then WMAX:=W[J]; THRESH:=TOL * WMAX; For J:=1 To MA do If W[J] < THRESH Then W[J]:=0; SVBKSB(U, W, V, NDATA, MA, B, A); CHISQ:=0; For I:=1 To NDATA do begin If FUNCS = 'FPOLY' Then FPOLY(X[I], AFUNC, MA); If FUNCS = 'FLEG' Then FLEG(X[I], AFUNC, MA); SUM1:=0; For J:= 1 To MA do SUM1:=SUM1 + A[J] * AFUNC[J]; CHISQ:=CHISQ + Sqr((Y[I] - SUM1) / SIG[I]); end; end;