ДельфинарийСтатьи

Математика в исходниках (3 стр)

Автор:

Дифференцирование функции

Численное нахождение производной функции одной переменной.
В данном примере находится значение производной в заданной точке.

немного теории
Имеем заданную точку 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

Страницы: 1 2 3 4 5 6 Следующая »

19 декабря 2005 (Обновление: 26 дек 2005)

Комментарии [1]