Automatsko odvajanje

V grobem poznamo 3 načine, kako lahko odvajamo funkcije z računalnikom

  • simbolično odvajanje
  • numerično odvajanje z končnimi diferencami
  • avtomatsko odvajanje programske kode

Tokrat se bomo posvetili avtomatskemu odvajanju. Programi

Avtomatsko odvajanje z dualnimi števili

Avtomatično odvajanje lahko implementiramo tako, da realna števila razširimo s posebnim elementom $\varepsilon$, za katerega velja $\varepsilon\not=0$ in $\varepsilon^2=0$. Tako dobimo množico dualnih števil, podobno kot dobimo množico kompleksnih številih, če realna števila razširimo z imaginarno enoto.

Dualna števila

Dualna števila so elementi oblike $a+b\varepsilon$, pri čemer sta $a$ in $b$ poljubni realni števili. Z dualna števili računamo kot z navadnimi binomi, le da upoštevamo, da je $\varepsilon^2=0$. Tako je produkt dveh dualnih števil enak

\[(a+b\varepsilon)(c+d\varepsilon) = ac + (ad+bc)\varepsilon + bd\varepsilon^2,\]

ker pa je $\varepsilon^2=0$, dobimo naslednje pravilo za produkt

\[(a+b\varepsilon)(c+d\varepsilon) = ac + (ad+bc)\varepsilon.\]

Podobno lahko izpeljemo pravilo za deljenje, oziroma inverz

\[\frac{1}{a+b\varepsilon} = \frac{a-b\varepsilon}{(a+b\varepsilon)(a-b\varepsilon)} = \frac{1}{a} - \frac{b}{a^2}\varepsilon\]

Za izpeljavo pravila za potenciranje z naravnimi števili, si pomagamo s potenco binoma

\[(a+b\varepsilon)^n = a^n + \binom{n}{n-1}a^{n-1}b\varepsilon + \varepsilon^2(\ldots...) = a^n + n a^{n-1}b\varepsilon,\]

za racionalne in realne potence, lahko uporabimo binomsko vrsto, za potence, kjer nastopa $\varepsilon$ v eksponentu, pa bi potrebovali potenčno vrsto za funkcijo $e^x$.

Dualna števila lahko izkoristimo za računanje odvodov. Z dualnimi števili se namreč računa podobno kot z diferenciali oziroma z linearnim delom Taylorjeve vrste imenovanim tudi 1-tok (1-jet). Poglejmo si primer produkta dveh 1-tokov za dve funkciji v neki točki $x_0$

\[\left(f(x_0) + f'(x_0)dx\right)\left(g(x_0) + g'(x_0)dx\right) = f(x_0)g(x_0) + (f(x_0)g'(x_0)+f'(x_0)g(x_0))dx + O(dx^2).\]

Vse potence $dx^k$ za $k>1$, lahko potisnemo v člen $O(dx^2)$ oziroma jih zanemarimo. Diferencial $dx$ se tako obnaša enako kot element $\varepsilon$. Dualna števila imajo isto aritmetiko kot 1-tokovi funkcij v neki točki $x_0$. To dejstvo izkoristimo za računanje odvoda.

Implementacija dualnih števil v programskem jeziku julia

Definirali bomo podatkovno strukturo Dual za dualna števila in osnovne aritmetične operacije za to strukturo.

Poleg tega bomo definirali funkcijo odvod(f, x), ki izračuna odvod funkcije v dani točki.

Obe funkciji preiskusimo na primeru funkcije, ki računa kvadratni koren z Newtonovo metodo.

function koren(x)
    y = 1+(x-1)/2 # Taylor
    for i=1:100
      y = (y + x/y)/2
    end
    return y
end

Koda

    NumMat.odvodFunction
    y = odvod(f<:Function, x)

    Izračuna vrednost odvoda funkcije f v točki x.

    source