{ Определение аппроксимирующей функции (F) и ее частных производных (GradF) для процедуры обобщенного поиска минимума функции многих переменных (см. модуль uGenFit). Аппроксимирующая функция: F(x):=A*(x-x0)*(x-x0)+B Параметры и их порядок в структуре данных: P=(A, x0, B); } {--------------------------------------------------------------------------- The control units for mass-spectrometer MI1201-AGM (c) Copyright Aleksandrov O.E., 1998 Модуль управления масс-спектрометром МИ1201-АГМ (c) Собственность Александрова О.Е., 1998 Molecular Physics department 620002, Екатеринбург, К-2 USTU, Ekaterinsburg, K-2, 620002 УГТУ, RUSSIA Кафедра молекулярной физики phone 75-48-39 тел. 75-48-39 E-mail: aleks@dpt.ustu.ru ----------------------------------------------------------------------------} unit uSqrXDef; interface USES uGenFit; type tFuncParams=record Size:tParameterNumber; A,x0,B:Double; end; tPtrFuncParams=^tFuncParams; const cParSize=SizeOf(tFuncParams) div SizeOf(Double); function F(const P:tParameters; X:Double):Double; procedure GradF(const P:tParameters; X:Double; var Grad:tParameters); procedure SelectInitials(var P:tParameters; const X,Y:tData); implementation function F; {F(x)=A*Sqr(x-x0)+B } begin with tPtrFuncParams(@P)^ do begin {$IfOpt R+} If Size<>cParSize then RunError(201); {$EndIf} x:=x-x0; F:=A*X*X+B; end; end; procedure GradF; begin with tPtrFuncParams(@P)^ do begin {$IfOpt R+} If Size<>cParSize then RunError(201); {$EndIf} x:=x-x0; end; with tPtrFuncParams(@Grad)^ do begin A :=x*x; { dF/dA } X0:=-2*tPtrFuncParams(@P)^.A*X; { dF/dX0 } B:=1; { dF/dB } end; end; { Выбор начального приближения для параметров } procedure SelectInitials; var dX,maxY,minY,minX,maxX,iX0:Double; i:word; begin with tPtrFuncParams(@P)^ do begin {$IfOpt R+} If Size<>cParSize then RunError(201); If (X.Size<>Y.Size) then RunError(201); If (X.Size<=Size+2) then RunError(201); If (X.Size>cMaxDataSize) then RunError(201); {$EndIf} maxY:=Y.Data[1]; minY:=Y.Data[1]; minX:=X.Data[1]; maxX:=X.Data[1]; iX0:=minX; for i:=2 to X.Size do begin if maxYcFPMin) AND (minY>cFPMin) then begin A:=minY/(minX*minX); end else begin A:=-1; end; end; end; end.