CV2 - Diferenční formule

Definujeme si první derivaci podle formule ((Subscript[f, n + 1])-(Subscript[f, n]))/h a formule  ((Subscript[f, n + 1])-(Subscript[f, n - 1]))/2  h, přesnou první derivaci dále druhou derivaci podle formule  ((Subscript[f, n + 1])-2(Subscript[f, n]) + (Subscript[f, n - 1]))/(h^2) a přesnou druhou derivaci.

d1a[f_, x_, h_] = (f[x + h] - f[x])/h;
d1b[f_, x_, h_] = (f[x + h] - f[x - h])/(2 h);
d1[f_, x_] = D[f[x], x];
d2a[f_, x_, 
          h_] = (f[x + h] - 2 f[x] + f[x - h])/(h*h);
d2[f_, x_] = D[f[x], {x, 2}];

Otestujeme formule na funkci Log v bodě (Subscript[x, 0])= 0.5 a pro krok h=0.01

f = Log; x0 = 0.5; h = 0.01;
der1a = d1a[f, x0, h];
der1b = d1b[f, x0, h];
der1 = d1[f, x0];
der2a = d2a[f, x0, h];
der2 = d2[f, x0];

Print["První derivace podle formule a) = ", 
      der1a]
Print["První derivace podle formule b) = ", 
      der1b]
Print["P\:0159esná první derivace           = ", 
      der1]
Print["Druhá derivace podle formule a) = ", 
      der2a]
Print["P\:0159esná druhá derivace           = ", 
      der2]

Otestujeme formule na funkci Log v bodě (Subscript[x, 0])= 0.5 a pro krok h=0.0001

f = Log; x0 = 0.5; h = 0.0001;
der1a = d1a[f, x0, h];
der1b = d1b[f, x0, h];
der1 = d1[f, x0];
der2a = d2a[f, x0, h];
der2 = d2[f, x0];

Print["První derivace podle formule a) = ", 
      der1a]
Print["První derivace podle formule b) = ", 
      der1b]
Print["P\:0159esná první derivace           = ", 
      der1]
Print["Druhá derivace podle formule a) = ", 
      der2a]
Print["P\:0159esná druhá derivace           = ", 
      der2]

Otestujeme formule na funkci Log v bodě (Subscript[x, 0])= 0.5 a pro krok h=(10^(-6)), zde se nám už projeví chyba počítače, bude větší než chyba metody.

f = Log; x0 = 0.5; h = 10^(-6);
der1a = d1a[f, x0, h]; 
der1b = d1b[f, x0, h]; 
der1 = d1[f, x0]; 
der2a = d2a[f, x0, h]; 
der2 = d2[f, x0];

\(\(\(
\)\(Print["První derivace podle formule a) = ", 
      der1a]

    Print["První derivace podle formule b) = ", der1b]

    Print["Přesná první derivace           = ", 
      der1]

    Print["Druhá derivace podle formule a) = ", der2a]

    Print["Přesná druhá derivace           = ", 
      der2]\)\)\)

Zde vidíme, že výsledek pro druhou derivaci podle formule a) se pro tento krok zhoršil, to je způsobeno přesností počítače. Vypíšeme si přesnost počítače

$MachinePrecision

Pro tuto přesnost nesmíme pro formuli pro druhou derivaci použít krok menší než (10^(-8 + d)), kde d je počet míst na kolik požedujeme přesnost výsledku.

Otestujeme formule na funkci Log v bodě (Subscript[x, 0])= 0.5 a pro krok h=(10^(-8)),  chyba počítače bude ještě větší.

f = Log; x0 = 0.5; h = 10^(-8);
der1a = d1a[f, x0, h]; 
der1b = d1b[f, x0, h]; 
der1 = d1[f, x0]; 
der2a = d2a[f, x0, h]; 
der2 = d2[f, x0];

\(\(\(
\)\(Print["První derivace podle formule a) = ", 
      der1a]

    Print["První derivace podle formule b) = ", der1b]

    Print["Přesná první derivace           = ", 
      der1]

    Print["Druhá derivace podle formule a) = ", der2a]

    Print["Přesná druhá derivace           = ", 
      der2]\)\)\)

Chyba se nyní projeví již na prvním místě výsledku.

Otestujeme formule na funkci Log v bodě (Subscript[x, 0])= 0.5 a pro krok h=(10^(-9)),  výsledek pro druhou derivaci bude úplně nesmyslný.

f = Log; x0 = 0.5; h = 10^(-9);
der1a = d1a[f, x0, h];
der1b = d1b[f, x0, h];
der1 = d1[f, x0];
der2a = d2a[f, x0, h];
der2 = d2[f, x0];

\(\(\(
\)\(Print["První derivace podle formule a) = ", 
      der1a]

    Print["První derivace podle formule b) = ", der1b]

    Print["Přesná první derivace           = ", 
      der1]

    Print["Druhá derivace podle formule a) = ", der2a]

    Print["Přesná druhá derivace           = ", 
      der2]\)\)\)