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 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
ker pa je $\varepsilon^2=0$, dobimo naslednje pravilo za produkt
Podobno lahko izpeljemo pravilo za deljenje, oziroma inverz
Za izpeljavo pravila za potenciranje z naravnimi števili, si pomagamo s potenco binoma
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$
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.DualNumber
— Type DualNumber(x, dx)
Predstavlja skalarnoi spremenljivko x in njen diferencial dx.
NumMat.odvod
— Functiony = odvod(f<:Function, x)
Izračuna vrednost odvoda funkcije f
v točki x
.