Eulerova metoda

Iterativní aplikování výsledku funkce jako argumentu do další iterace funkce

ClearAll["Global`*"]

Nejprve si připomeňme, co dělají funkce Nest a NestList, které budeme používat pro naše výpočty.

Nest[g,x,5]

Nest[Cos,x,5]

Nest[Cos,x=0,5]

ClearAll[x]

NestList[g,x,5]

NestList[Cos,x=0,5]

Nabíjení kondenzátoru přes rezistor - numerická metoda

Zadání obvodu

ClearAll["Global`*"]
u = 10.; (*napětí zdroje napětí*)
u0=0.;  (*počáteční napětí na kondenzátoru*)
R = 100.;(*odpor rezistoru*)
Cap = (10^(-6));(*kapacita kondenzátoru*)
tmin = 0.;(*počáteční čas*)
tmax = 0.001;(*konečnýčas*)

Řešení obvodu

Použijeme Eulerovu metodu, která počítá průběh funkce podle vzorce:
			f(t + Δt) ≈ f(t) + f'(t)·Δt

V našem případě bude hledanou funkcí napětí uc na konenzátoru, tedy:
			uc(t + Δt) ≈ uc(t) + uc'(t)·Δt

Derivaci napětí uc' vyjádříme z obvodových rovnic. Použijeme zjednodušený popis z notebooku CAO-Uzly-Priklad2-Kratsi.nb.
rezistor R: 		u(t) - uc(t) == R·i(t)
kondenzátor C: 	i(t) == Cap·uc'(t)

Z toho dostáváme
			u(t) - uc(t) == R·Cap·uc'(t);
a tedy
			uc'(t)==((u(t)-uc(t))/(R·Cap))

Dosadíme-li hodnotu derivace do vzorce pro Eulerovu metodu, dostáváme iterativní vzorec pro výpočet napětí v čase t + Δt při znalosti napětí v čase t:

			uc(t + Δt) ≈ uc(t) + ((u(t)-uc(t))/(R·Cap))·Δt

Interval řešení si rozdělíme na n = 100 menších úseků. Každý úsek má velikost Δt.

n = 100;(*počet kroků mezi počátečním a konečným časem*)
Δt=(tmax/n);(*velikost kroku*)

V jednom kroku Eulerovy metody z napětí uc v čase t spočítáme nové napětí uc v čase t + Δt. Tedy v čase postoupíme z t do t + Δt, v napětí postoupíme z uc do uc+((u-uc)/(R*Cap))*Δt

krok[{t_, uc_}]:={t+Δt, uc+((u-uc)/(R*Cap))*Δt};
NestList[krok, {t=tmin,uc=u0}, n](*Vypíše list (seznam) všech iterací*)

Vykreslení výsledků - numerická metoda

graf1=ListPlot[NestList[krok, {t=0,uc=0}, n], PlotRange->{{tmin,tmax},{u0,u}},PlotStyle->{Red,Thick}]

Nabíjení kondenzátoru přes rezistor - analytická metoda

Zadání obvodu

ClearAll[u,R,Cap,tmin,tmax,u0,rce1,poc1,reseni, uc,t]
u= 10;
R = 100;
Cap = (10^(-6));
tmin=0;
tmax=0.001;
u0=0;

Řešení obvodu

rce1 = uc[t] ==u-R*Cap*uc'[t];
poc1 = uc[0]==u0;
reseni=DSolve[{rce1,poc1}, uc[t],t]

Vykreslení výsledků - analytická metoda

graf2=Plot[uc[t]/.reseni,{t,0,0.001},PlotRange->{{tmin,tmax},{u0,u}},PlotStyle->Blue]

Srovnání přesnosti obou metod

Analytická metoda je přesná, protože řešení diferenciální rovnice je nejprve spočteno analyticky. Výsledkem je matematická funkce, ze které  je teprve vykreslen graf. 
Numerická metoda je méně přesná a přesnost závisí na velikosti kroku. Jemnější krok znamená vyšší přesnot. Výhodou je, že numerická metoda funguje i tehdy, kdy analytické řešení nelze nalézt.

Show[graf2,graf1]

Pozorujte velikost odchylky numerické metody od přesného analytického řešení pro různou velikost kroku. Změna hodnoty proměnné n nepřímo úměrně ovlivňuje krok v numerické metodě. 
Doporučujeme vyzkoušet n = 15,30,50,100 a 200.

Samostatné úlohy

Vykreslete graf proudu i[t], který teče kondenzátorem

Vykreslete graf napětí na rezistoru