Skip to content

Commit

Permalink
Add description for runge kutta method
Browse files Browse the repository at this point in the history
  • Loading branch information
fuodorov committed Feb 2, 2024
1 parent 6804db3 commit 3e9e612
Show file tree
Hide file tree
Showing 6 changed files with 86 additions and 8 deletions.
23 changes: 23 additions & 0 deletions bibliography.bib
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,29 @@ @online{REDPIC
url={https://github.com/fuodorov/redpic},
urldate={2024-01-01}
}
@ARTICLE{2020SciPy,
author = {Virtanen, Pauli and Gommers, Ralf and Oliphant, Travis E. and
Haberland, Matt and Reddy, Tyler and Cournapeau, David and
Burovski, Evgeni and Peterson, Pearu and Weckesser, Warren and
Bright, Jonathan and {van der Walt}, St{\'e}fan J. and
Brett, Matthew and Wilson, Joshua and Millman, K. Jarrod and
Mayorov, Nikolay and Nelson, Andrew R. J. and Jones, Eric and
Kern, Robert and Larson, Eric and Carey, C J and
Polat, {\.I}lhan and Feng, Yu and Moore, Eric W. and
{VanderPlas}, Jake and Laxalde, Denis and Perktold, Josef and
Cimrman, Robert and Henriksen, Ian and Quintero, E. A. and
Harris, Charles R. and Archibald, Anne M. and
Ribeiro, Ant{\^o}nio H. and Pedregosa, Fabian and
{van Mulbregt}, Paul and {SciPy 1.0 Contributors}},
title = {{{SciPy} 1.0: Fundamental Algorithms for Scientific
Computing in Python}},
journal = {Nature Methods},
year = {2020},
volume = {17},
pages = {261--272},
adsurl = {https://rdcu.be/b08Wh},
doi = {10.1038/s41592-019-0686-2},
}
@article{Logatchev2011,
author = {Logatchev, Pavel and Malyutin, Dmitriy and Starostenko, A.},
year = {2011},
Expand Down
1 change: 1 addition & 0 deletions main.tex
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@

\input{src/texts/introduction_kenv}
\input{src/texts/envelope_equations}
\input{src/texts/runge_kutta}
\input{src/texts/simulation}
\input{src/texts/genetic_envelope}
\input{src/texts/conclusion_kenv}
Expand Down
1 change: 1 addition & 0 deletions src/texts/abbreviations.tex
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@
\item PIC "--- particle-in-cell (частицы в ячейке)
\item KENV "--- Kapchinsky-Vladimirsky envelope code (код на основе уравнений Капчинского-Владимирского)
\item REDPIC "--- Relativistic difference scheme particle-in-cell code (код на основе релятивистской разностной схемы)
\item ОДУ "--- обыкновенное дифференциальное уравнение
\end{enumerate}
16 changes: 8 additions & 8 deletions src/texts/appendix_kenv_listing.tex
Original file line number Diff line number Diff line change
Expand Up @@ -337,10 +337,10 @@
\end{lstlisting}

\begin{lstlisting}[language=python]
from scipy.integrate import odeint
from scipy.integrate import solve_ivp
from scipy.misc import derivative

def dXdz(X, z):
def dXdz(z, X):

x = X[0]
sigma_x = X[1]
Expand Down Expand Up @@ -376,20 +376,20 @@

\begin{lstlisting}[language=python]
def find_sigma_x(z):
X0 = [dadz, a, dbdz, b]
X0 = np.array([dadz, a, dbdz, b])

sol = odeint(dXdz, X0, z, rtol = 0.001)
sigma_x = sol[:, 1] # m
sol = solve_ivp(dXdz, t_span=[z[0],z[-1]], y0=X0, t_eval=z)
sigma_x = sol.y[1, :]

return sigma_x # m
\end{lstlisting}

\begin{lstlisting}[language=python]
def find_sigma_y(z):
X0 = [dadz, a, dbdz, b]
X0 = np.array([dadz, a, dbdz, b])

sol = odeint(dXdz, X0, z, rtol = 0.001)
sigma_y = sol[:, 3] # m
sol = solve_ivp(dXdz, t_span=[z[0],z[-1]], y0=X0, t_eval=z)
sigma_y = sol.y[3, :] # m

return sigma_y # m
\end{lstlisting}
Expand Down
1 change: 1 addition & 0 deletions src/texts/envelope_equations.tex
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
\section{Уравнения огибающей для пучка}\label{sec:envelope_equation}
В ускорительных комплексах используются соленоидальные и квадрупольные линзы, при этом преимущественно соленоидальные линзы расположены вместе с ускоряющими модулями, а квадрупольные линзы только в каналах разводки.
Рассмотрим два случая: уравнение огибающей для аксиально-симметричного пучка в канале с соленоидальными линзами и уравнения огибающей для эллиптического пучка с фокусировкой квадрупольными линзами.
Подробный вывод уравнений Капчинского-Владимирского приведен в приложении~А.

\subsection{Уравнение огибающей для аксиально симметричного пучка в канале с соленоидальными линзами}\label{subsec:envelope_equation_solenoid}
Движение аксиально-симметричного пучка в транспортном канале при наличии соленоидов может быть описано следующим уравнением~\ref{eq:envelope_axial}~\cite{Louson}:
Expand Down
52 changes: 52 additions & 0 deletions src/texts/runge_kutta.tex
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
\section{Вычислительная сложность основных алгоритмов}\label{sec:algorithms_kenv}
Ядром кода KENV служит функция solve\_ivp из библиотеки scipy~\cite{2020SciPy} для решения дифференциальных уравнений Капчинского-Владимирского.
Авторами данной библиотеки рекомендуется использовать метод Рунге-Кутта 4 порядка для решения дифференциальных уравнений.
Рассмотрим точность этого метода.

Листинг основных функций KENV с комментариями приведен в приложении~Б.

\subsection{Метод Рунге-Кутта 4-го порядка}\label{subsec:runge_kutta_4}

Метод Рунге-Кутта 4-го порядка является одним из наиболее широко используемых численных методов для решения обыкновенных дифференциальных уравнений (ОДУ).
Основное его преимущество заключается в высокой точности и относительной простоте реализации.
Этот метод позволяет найти приближенное решение ОДУ, не требуя аналитического интегрирования.

Для дифференциального уравнения вида:
\begin{equation}
\label{eq:diff_equation}
\frac{dy}{dx} = f(x, y),
\end{equation}
где $y = y(x)$ — искомая функция, метод Рунге-Кутта 4-го порядка определяет значение $y$ в точке $x + h$ через значение в точке $x$ с помощью следующих вычислений:
\begin{align*}
\label{eq:runge_kutta}
k_1 &= h f(x, y), \\
k_2 &= h f\left(x + \frac{h}{2}, y + \frac{k_1}{2}\right), \\
k_3 &= h f\left(x + \frac{h}{2}, y + \frac{k_2}{2}\right), \\
k_4 &= h f(x + h, y + k_3), \\
y_{n+1} &= y_n + \frac{1}{6}(k_1 + 2k_2 + 2k_3 + k_4).
\end{align*}

Здесь $h$ — шаг по переменной $x$, а $y_{n+1}$ — приближенное значение функции $y$ в точке $x + h$.
Величины $k_1$, $k_2$, $k_3$ и $k_4$ представляют собой промежуточные наклоны,
которые используются для вычисления конечного наклона, по которому и определяется следующее значение функции.

Этот метод обладает четвертым порядком точности, что означает, что ошибка на каждом шаге пропорциональна пятой степени шага $h$.
Благодаря этому, метод Рунге-Кутта 4-го порядка обеспечивает высокую точность при решении дифференциальных уравнений, что делает его особенно полезным для задач, требующих высокой точности, таких как решение уравнения Капчинского-Владимирского для огибающей пучка.


\subsection{Порядок точности метода Рунге-Кутта 4-го порядка}\label{subsec:accuracy_runge_kutta}

Порядок точности численного метода определяет, насколько быстро уменьшается ошибка приближенного решения с уменьшением шага $h$.
Для метода Рунге-Кутта 4-го порядка можно показать, что ошибка на каждом шаге пропорциональна $h^5$, а суммарная ошибка после $N$ шагов пропорциональна $h^4$, если $Nh = const$.
Это делает метод чрезвычайно эффективным для задач, где требуется высокая точность.

Для вывода порядка точности рассмотрим разложение Тейлора для функции $y(x+h)$:
\begin{equation}
\label{eq:teilor_y}
y(x+h) = y(x) + hy'(x) + \frac{h^2}{2!}y''(x) + \frac{h^3}{3!}y'''(x) + \frac{h^4}{4!}y^{(4)}(x) + O(h^5).
\end{equation}

Сравнивая это с выражением для $y_{n+1}$, полученным в методе Рунге-Кутта, можно увидеть, что первые четыре члена совпадают, если функция $f(x, y)$ и её производные непрерывны и ограничены.
Различие начинается с членов порядка $O(h^5)$, что указывает на то, что ошибка одного шага метода Рунге-Кутта 4-го порядка имеет порядок $h^5$.

Однако, поскольку общая ошибка складывается из ошибок на каждом шаге, а количество шагов обратно пропорционально величине шага $h$, то есть $N \propto \frac{1}{h}$, общая ошибка метода пропорциональна $h^4$.

0 comments on commit 3e9e612

Please sign in to comment.