====== Вычисление пределов с помощью ряда Тейлора ======
К примеру, //sin = x -(x3/3!)+(x5/5!)- ... //
Здесь описано как вычислять **Sin, Cos, ArcTg, Exp**. Другие функции пишутся аналогично.
===== Точность вычисления =====
Для того, чтобы вычислить //приближённое значение по формуле//, мы должны взять бесконечно большое число, чтобы приблизиться к истинному значению функции. Т.е. при //n//->infinity (бесконечность), получаем истинное значение функции в данной точке.\\
На практике мы этого не станем делать, так как в Паскале имеются типы с ограниченным размером, такие как: //Real, Single, Double, Extended//. Что же теперь делать?
Введём понятие **точность вычисления** и назовём эту переменную //eps// (epsilon). Точность вычисления может быть разная: 0.05, 0.001 и намного большая, 10-8. В большинстве случаев хватает точности 3 знака после нуля, поэтому возьмём eps=0.001, или в краткой форме записи для Паскаля, 1e-3, что означает 1*10-3. Типа //Single //для этой точности вполне хватит, на нём и остановимся.
Если истинное значение функции в заданной точке равно, допустим, **1.232//8//**, а вычисленное значение равно **1.232//3//**, то при нашей точности вычисления разница по модулю между ними составляет 0.0005n * x2n+1 / (2n+1)!]// , где //n//->infinity.
Из чего состоит данная формула?
Из вычисления степени числа (функция //Power//), факториала числа (функция //Factorial//) и вычисления знака (функция //Sign//).
Для повторения вычисления этих функций смотрите прикреплённые вверху ссылки.
Теперь надо собрать все эти функции в одном выражении, которое будет вычисляться в отдельной функции.
{ вычисление значения элемента с индексом //i// ряда Тейлора для синуса}
function Sine (x: single; i: integer): single;
var k: integer;
begin
K := 2 * i + 1;
Sine := ( Sign (i) * Power (x, k) / factorial (k) );
end;
Что осталось? Объединить всё написанное в одной функции вычисления приближённого значения //FunctionValue//.
function FunctionValue (x: single): single;
На входе задаётся точка (число), в которой нужно вычислить значение функции.
===== Примеры программ =====
==== Общий случай ====
Значение функции вычисляется в процедуре **FunctionValue**. Только подставьте нужное название функции.
А теперь программа:
const eps: single = 1e-3; { Epsilon - необходимая точность, 1*10^(-3) }
function Factorial (N: word): single; { N! }
var
f: single;
begin
Factorial := 1.0;
if n = 0 then exit;
f := 1.0;
for n := 1 to n do
f := f * n;
Factorial := f;
end;
function Sign (p: integer): single; { (-1)^p }
begin
if Not Odd(P) then
Sign := 1
else
Sign := -1;
end;
function Power (base: single; N: integer): single; { степень N по основанию base }
var k: integer;
P: single;
begin
P := 1.0;
for k := 1 to N do
P := P * base;
Power := P;
end;
{--------------------------------------------------------------------}
function Sine (x: single; i: integer): single;
var k: integer;
begin
K := 2 * i + 1;
Sine := ( Sign (i) * Power (x, k) / factorial (k) );
end;
function CoSine (x: single; i: integer): single;
var k: integer;
begin
K := 2 * i;
CoSine := ( Sign (i) * Power (x, k) / factorial (k) );
end;
function ArcTg (x: single; i: integer): single;
var k: integer;
begin
K := 2 * i + 1;
ArcTg := ( Sign (i) * Power (x, k) / k );
end;
function Exp (x: single; i: integer): single;
begin
Exp := Power (x, i) / factorial (i);
end;
{--------------------------------------------------------------------}
function FunctionValue (x: single): single;
var sum,old: single;
index: integer;
begin
if x <= 0.0 then
begin
FunctionValue := 0.0;
exit;
end;
index := 0;
sum := 0.0;
repeat { повторять }
old := sum; { old - прежнее вычисленное значение функции }
sum := sum + ArcTg (x, index); { Sin, Cos, Exp }
index := index + 1;
until abs (sum - old) < eps; { пока не достигнута необходимая точность }
FunctionValue := sum
end;
begin
writeln ( 'ArcTg (x) =', FunctionValue ( 1.0 / sqrt (3.0) ) : 8 : 3 ); { ArcTg }
{ writeln ( 'Cosinus (x) =', FunctionValue ( pi / 6.0 ) : 8 : 3 ); { CoSine }
readln;
end.
==== Вычисление косинуса ====
cos X = 1 - (X ^ 2 / 2!) + (X ^ 4 / 4!) + (X ^ 6 / 6!) + ...
{ Implementing Taylor expansion for cosine }
program Cosine_Taylor;
function Factorial (N: integer): double; { N! }
var
f: double;
begin
Factorial := 1.0;
if n = 0 then exit;
f := 1.0;
for n := 1 to n do
f := f * n;
Factorial := f
end;
{ cos X = 1 - (X ^ 2 / 2!) + (X ^ 4 / 4!) + (X ^ 6 / 6!) + ... }
function CalcCos (x: double): double;
var
term, sum, oldsum: double;
i, n: integer;
begin
i := 0;
n := 0;
sum := 1.0; { initializing first term value }
repeat
oldsum := sum;
x := sqr(x); { implementing X^2, X^4, ... each itteration}
n := n + 2;
term := x / Factorial(n); { taking into account term, evaluated in previous itteration }
i := i + 1;
if Odd(i) then
term := -term; { negate term each itteration }
sum := sum + term;
until abs (sum - oldsum) < 1e-3 {desired precision};
CalcCos := sum
end;
var x: double;
begin
readln(x); {x - input value, in radians}
writeln ('Comparing computed results:');
writeln ('Infinite serie sum = ', CalcCos(x):4:3);
writeln ('cos(x)=', cos(x):4:3);
readln;
end.