Principle based (klasszikus irányzat --> társtudományok elméletén alapuló)
Data-driven (manapság új és divatos irányzat --> adat, gépi tanulás / neurális háló alapú)
Hibrid (a fenti kettő kombinálása)
Legyen $G\subset \mathbb{R}\times \mathbb{R}^d$ összefüggű nyílt halmaz, $(t_0,u_0)\in \mathbb{G}$ egy adott pont, $f:G\to \mathbb{R}^d$ egy folytonos leképezés. A
\begin{cases} \frac{du(\cdot)}{dt}= f(\cdot,u)&\\ u(t_0)=u_0, & \end{cases}feladatot kezdetiérték-feladatnak (Cauchy-feldatnak) nevezzük.
Explicit Euler (1768)
A közelítéshez a derivált fogalmát és a $\color{blue}{\text{jobboldali differenciahányadost}}$ használhatjuk:
$$ u'(t)=\lim_{h\to 0}\frac{u(t+h)-u(t)}{h}=f(t,u(t)) $$
$$
u'(t) \approx \color{blue}{\frac{u(t+h)-u(t)}{h}}=f(t,u(t))
$$
Cél: Minden rácspontban a pontos és numerikus közel legyen egymáshoz: $u(t_n) \approx y(t_n)$
Ekkor a javasolt numerikus módszer:
A pontos megoldás adott rácspontjaiban Taylor-sorfejtés után:
$$
\frac{u(t_n)+h\cdot u'(t_n) + \frac{h^2}{2!}\cdot u''(t_n)+\mathcal{O}(h^3)-u(t_n)}{h}=f(t_n,u(t_n))
$$
Egyszerűsítés és összevonás után a hibatag az alábbi: $$ \frac{\color{blue}{h^{1}}}{2}\cdot u''(\xi) $$
$\color{red}{\text{Baloldali differenciahányadost}}$ használva a numerikus módszer:
\begin{cases} \color{blue}{y_{n+1}= y_n + h} \color{red}{f(t_{n+1},y_{n+1})}\color{blue}{ \quad n=0,1,\ldots} &\\ \color{blue}{y_0=u_0} & \end{cases}
Taylor-sorfejtés és egyszerűsítés után a hibatag:
$$
-\frac{\color{red}{h^1}}{2}\cdot u''(\xi)
$$
Amiről híres: Teszt egyenlet (A-stabilitás), Többlépéses módszerek stabilitás elmélete, G-stabilitás, ...
A megoldás: $u(t)=u_0e^{\lambda t}$. A tesztfeladatra alkalmazott tetszőleges egylépéses módszer esetén
$$y_{n+1} = R(h\lambda)y_{n}.$$A tesztfeladat esetén a megoldás korlátosságához: $$Re(\lambda)\leq 0$$
Az $R(h\lambda)$ stabilitási függvényre vonatkozóan a stabilitási tartomány: $$S = \{ h\lambda\in\mathbb{C}: |R(h\lambda)|\leq 1 \}$$
Ezeket összevetve az A-stabilitáshoz kell: $$S\supset \mathbb{C}^{-}$$
## A NODEpy egy speciális nemlineáris közönséges differenciálegyenlet megoldó csomag
from nodepy import rk
explicit_euler = rk.loadRKM('FE')
explicit_euler.plot_stability_region()
from nodepy import rk
implicit_euler = rk.loadRKM('BE')
implicit_euler.plot_stability_region()
$\color{blue}{\text{Explicit Euler}}$
$\color{red}{\text{Implicit Euler}}$
Logisztikus növekedés (Verhulst-féle modell, 1838)
ahol
run expliciteuler.py
def f(t, u):
K = 83.4772
r = 0.977361
return r*u-r/K*u**2
h, t_n, y = expliciteuler(f,1.53008,0,10,200)
import matplotlib.pyplot as plt
plt.plot(t_n, y, 'mo')
plt.title('Explicit Euler a babszarnövekedésre')
plt.show()
def f(t, u):
K = 18.516*10e+6
r = 0.239318
return r*u-r/K*u**2
h, t_n, y = expliciteuler(f,0.194123*10e+6,0,80,200)
import matplotlib.pyplot as plt
plt.plot(t_n, y)
plt.title('Explicit Euler az olasz autó eladásokra 1950 - 1980 között')
plt.axis([0, 30, 0, 18*10e+6])
plt.show()
Newton módszer a $\color{blue}{g(x)=0}$ nemlineáris egyenlet megoldására:
$$x_{n+1} = x_n - \frac{g(x_n)}{g'(x_n)}, \quad n=0,1,\ldots,\ \text{és}\ x_0\ \text{adott}$$Tipikus leállási feltételek:
Implicit Eulerre alkalmazva: $$\color{blue}{g(y_{n+1})=}\color{red}{y_{n+1}-y_{n}-hf(t_{n+1},y_{n+1})}\color{blue}{=0}$$
run impliciteuler.py
h, t_n, y = impliciteuler(1.53008,0,10,200)
import matplotlib.pyplot as plt
plt.plot(t_n,y)
plt.title('Implicit Euler a babszarnövekedésre')
plt.show()
Tekintsük a Lotka-Volterra modell (1926) modell konkrét alakját
ahol
run RK4sys.py
def f(t, y):
y1, y2 = y
return [beta1*y1-alpha1*y1*y2, -beta2*y2+alpha2*y1*y2]
beta1 = 0.6
beta2 = 0.6
alpha1 = 0.3 * 10 ** -4
alpha2 = 1.5 * 10 ** -5
h, t, y = RK4sys(f, [90000, 2000], 0, 50, 10000)
first = y[:,0]
second = y[:,1]
import matplotlib.pyplot as plt
fig = plt.figure()
l1, l2 = plt.plot(t, first, t, second)
fig.legend((l1, l2), ('Zsákmány (Nyúl / Hal)', 'Ragadozó (Róka / Ember)'),loc ="upper right")
plt.show()
h, t, y = RK4sys(f, [90000, 2000], 0, 50, 10000)
fig = plt.figure()
plt.plot(y[:,0], y[:,1])
Az egyszerűsített Lorenz modell (1963):
ahol
def f(t, y):
y1, y2, y3 = y
return [sigma*(y2-y1), r*y1-y2-y1*y3, y1*y2-b*y3]
sigma = 10
b = 8/3
r = 28
h, t, y = RK4sys(f, [0, 1, 0], 0, 100, 10000)
first = y[:,0]
third = y[:,2]
fig = plt.figure()
plt.plot(first, third)
plt.xlabel('x')
plt.ylabel('z')
plt.title('Lorenz attraktor, x-z sík')
plt.show()
Tekintsük az alábbi két reakciós autokatalikus reakció elméleti modelljét:
\begin{cases} u_1'(t)=A+u_1(t)^2u_2(t)-(B+1)u_1(t)&\\ u_2'(t)=Bu_1(t)-u_1(t)^2u_2(t) \end{cases}ahol $A$ és $B$ pozitív konstansok.
from scipy.integrate import solve_ivp
def f(t,y):
A = 1
B = 3
y1, y2 = y
return [A + y1 ** 2 * y2 - (B + 1) * y1, B * y1 - y1 ** 2 * y2]
sol = solve_ivp(f, [0, 20], [1.5, 3],rtol = 10 ** -10, atol = 10 ** -10)
import matplotlib.pyplot as plt
fig = plt.figure()
a1, a2 = plt.plot(sol.t, sol.y[0], sol.t, sol.y[1])
fig.legend((a1,a2), ('Első komponens','Második komponens'),'upper right')
plt.show()
import numpy as np
h = np.zeros(len(sol.t)-1)
print(len(sol.t))
for i in range (0,len(sol.t)-1):
h[i] = sol.t[i+1]-sol.t[i]
print(np.amin(h[0:-1]))
print(np.amax(h))
plt.semilogy(sol.t[1:-1], h[0:-1], 'b*')
Szabályozó | $\beta_1$ | $\beta_2$ | $\alpha$ |
---|---|---|---|
I | 1 | 0 | 0 |
PI3333 | 2/3 | -1/3 | 0 |
H211PI | 1/6 | 1/6 | 0 |
H211b | 1/b | 1/b | 1/b |
![]() |
![]() |
![]() |
![]() |