Математика в исходниках (3 стр)
Автор: DROnik
Дифференцирование функции
Численное нахождение производной функции одной переменной.
В данном примере находится значение производной в заданной точке.
немного теории
Имеем заданную точку X0. В её окрестности [X0-aInt,X0+aInt] получаем прямую проходящую через концы отрезка.
Если она лежит к заданой точке ближе чем aTol, то считаем полученную прямую косательной в точке X0.
В противном случае уменьшаем aInt и повторяем всё сначала.
>Таким образом на входе мы имеем:
X0 - значение переменной
aTol - необходимая точность апроксимацииx*
aInt - полуинтервал
func - заданная функция
>На выходе получаем:
Derivation - значение производной
aInt - полуинтервал на котором обеспечивается заданная точность
*Поскольку возможности оценить точность найденной производной у нас нет, то мы оцениваем точность замены заданной функции линейной апроксимацией в полученном интервале.
Исходник
program Derivator; uses SysUtils; {$APPTYPE CONSOLE} //>>>>>>>>>>> Derivator >>>>>>>>>>>> type TDerFloat = single; TDerFunction = function(Variable: TDerFloat): TDerFloat; function Derivation( X0, aTol: TDerFloat; var aInt: TDerFloat; func: TDerFunction): TDerFloat; var Y1,Y2: TDerFloat; tg: TDerFloat; Y0: TDerFloat; er: TDerFloat; begin er:= aTol+1; tg:= 0; while er>aTol do begin Y1:= func( X0-aInt); Y2:= func( X0+aInt); tg:= ( Y2-Y1)/( 2*aInt); Y0:= func( X0); er:= abs( ( Y1+tg*aInt)- Y0); if er>aTol then aInt:= 0.75*aInt; end; result:= tg; end; //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> function TestFunc( X: single): single; begin result:= X*X*X -2*X*X -X +4 + sin( x); end; function TestFuncDer( X: single): single; begin result:= 3*X*X -4*X -1 + cos( x); end; const checkPoint = pi; Tol= 1e-3; var interval: single = 0.5; Der: single; begin writeln( 'Tolerance = ',formatFloat( '000.0000',Tol) ); writeln; writeln( 'Start interval = ',formatFloat( '000.0000',interval) ); Der:= Derivation( checkPoint,Tol,interval,TestFunc); writeln( 'Absolute error = ', formatFloat( '000.0000', abs( Der - TestFuncDer( checkPoint) )) ); writeln; writeln( 'Doveritelnij Interval = ',formatFloat( '000.0000',interval)); writeln( 'Prognoz Error = ', formatFloat( '000.0000', abs( TestFunc( checkPoint)+Der*( interval) -TestFunc( checkPoint+interval) )) ); readln; end.
DROник (c) 2005
19 декабря 2005 (Обновление: 26 дек 2005)
Комментарии [1]