Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • master
  • opengl
  • v0.1
3 results

Target

Select target project
  • repos.tanguy.cavagna/physics/electric-field
1 result
Select Git revision
  • master
  • opengl
  • v0.1
3 results
Show changes
Commits on Source (2)
......@@ -8,6 +8,8 @@ _minted-doc/
*.fls
*.bcf
*.run.xml
*.md5
*.auxlock
# PDF output - usually a bad idea to keep this in Git
*.pdf
......
doc/figures/cover-field.png

1.76 MiB | W: 0px | H: 0px

doc/figures/cover-field.png

621 KiB | W: 0px | H: 0px

doc/figures/cover-field.png
doc/figures/cover-field.png
doc/figures/cover-field.png
doc/figures/cover-field.png
  • 2-up
  • Swipe
  • Onion skin
doc/figures/field-lines-2.png

275 KiB

doc/figures/field-lines-4.png

269 KiB

doc/figures/field-lines-6.png

223 KiB

doc/figures/heatmap-12.png

252 KiB

doc/figures/heatmap-6.png

193 KiB

doc/figures/vector-field-12.png

76.9 KiB

doc/figures/vector-field-6.png

48.9 KiB

......@@ -23,6 +23,7 @@
\RequirePackage{booktabs} % Publication quality tables
\RequirePackage{longtable} % Allow tables to flow over page boundaries
\RequirePackage{multirow} % Create tabular cells spanning multiple rows
\RequirePackage{multicol}
\RequirePackage{graphicx} % Enhanced support for images
\RequirePackage{float} % Improved interface for floating objects
......@@ -36,6 +37,7 @@
\RequirePackage{tikz} % Create PostScript and PDF graphics
\RequirePackage{xspace} % Define commands that appear not to eat spaces
\RequirePackage{microtype} % Refinements towards typographical perfection
\RequirePackage{pgfplots} % Advanced ploting
\RequirePackage{geometry} % Customize document dimensions
\RequirePackage{titlesec} % Select alternative section titles
......@@ -56,6 +58,9 @@
%% Scaling the margins to be slightly smaller than default (.7)
\geometry{a4paper,hscale=0.75,vscale=0.8}
%% Plots configuration
\pgfplotsset{width=10cm,compat=1.9}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% I. Loading the fonts %%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
......
\chapter{Conclusion}
\label{chapter:conclusion}
\emph{A conclusion...}
\section{Évolution du temps de calcul}
\label{sec:time-evolution}
Le temps de calcul varie grandement en fonction du nombre de particules dans l'univers
ainsi que l'espacement fixé entre les points de la grille utilisée pour calculer les lignes de champs.
Comme le graphique ci-dessous le montre, la croissance du temps est presque exponentielle.
Il est clair que la façon dont les lignes sont calculées n'est donc pas efficace et qu'il est
nécessaire de changer de méthode s'il on veut pouvoir avoir un nombre de particules plus élevé et
un espacement entre points de grille plus petit (sachant que moins de 5px les lignes deviennent un
amas illisible tant la distances entre elles est faible).
\begin{figure}[h]
\centering
\caption{Variance du temps de calcul des lignes de champs}
\begin{tikzpicture}[scale=.7]
\begin{axis}[
ybar,
bar width=10pt,
ymin=0,
xmin=0,
ylabel=Secondes,
xlabel=Nombre de particules,
xtick={2, 10, 15},
legend pos=north west
]
\addlegendimage{empty legend}
\addplot+[error bars/.cd,
y dir=both,y fixed=0.01,
]
coordinates {
(2, 0.1630385)
(10, 0.2835994)
(15, 0.3111888)
};
\addplot+[error bars/.cd,
y dir=both,y fixed=0.03,
]
coordinates {
(2, 0.4662245)
(10, 0.8618891)
(15, 0.733422)
};
\addplot+[error bars/.cd,
y dir=both,y fixed=0.1,
]
coordinates {
(2, 1.6592141)
(10, 3.2944945)
(15, 3.4218168)
};
\addlegendentry{\hspace{-.3cm}\textbf{Espacement}}
\addlegendentry{16px}
\addlegendentry{10px}
\addlegendentry{5px}
\end{axis}
\end{tikzpicture}
\end{figure}
\ No newline at end of file
\chapter{Expériences}
\label{chapter:experiences}
Pour représenter de façon graphique le champs électrostatique, il nous faut définir un
univers discret. Cet univers est défini comme $[0,1]\times[0,1]$. Chaque particule du
système aura donc une position dans cet univers, ainsi qu'une charge (mutliple de la charge
élémentaire).
\section{Ligne de champs}
Le dessin numérique d'une courbe se fait en l'approximant à l'aide de plusieurs petits
ségments de droite mis bout à bout. Pour dessiner cette courbe, il nous faut trouver un
ensemble de points appartenant à cette lignes. Pour cela on procède ainsi :
\begin{enumerate}
\item Tirage aléatoire d'un point dans l'univers $P_0$.
\item Assignation $P = P_0$.
\item On calcul ensuite $P_{suivant}$ en fonction de l'intensité et de la direction du champ
en $P$. Ce qui donne l'équation \ref{eqn:next-point}. Cependant, dans notre cas nous
voulons avancer d'une distance identique à chaque fois, et qui ne soit pas trop grande.
Il faut donc commencer par normaliser notre champs, puis le multiplier par une constante
$\delta x$ fixe définie en fonction de la taille de la fenêtre. Ce qui nous donne :
$P_{suivant} = P \pm \delta x \cdot \frac{\vec{E}}{||\vec{E}||}$ avec $\delta x = \frac{1}{\sqrt{largeur^2 + hauteur^2}}$
et $\vec{E} = \sum_{i=1}^N E_i \frac{\lvec{q_i P_n}}{||\lvec{q_i P_n}||}$. \textit{En fonction du sens du dessin
de la ligne, $+$ ou $-$ $\delta x$}.
\item Si $P$ et $P_{suivant}$ sont à une distance des particules supérieur à un seuil choisi
et qu'ils sont toujours dans notre univers, on trace un segment entre $P$ et $P_{suivant}$. Sinon on quitte la boucle.
\item On assigne $P = P_{suivant}$ et on revient à l'étape 3.
\end{enumerate}
\begin{figure}[h]
\centering
\caption{Dessin d'une ligne de champs}
\begin{tikzpicture}[line/.style={->,shorten >=0.4cm,shorten <=0.4cm},very thick, scale=0.7]
\coordinate (Plus) at (0, 0);
\coordinate (Minus) at (6, 0);
\coordinate (P) at (3, 2);
\path [red, line, bend right] (P) edge (Plus);
\path [blue, line, bend left] (P) edge (Minus);
\filldraw (P) circle (3pt);
\filldraw (Plus) node[white] {$+$} circle (0.3);
\filldraw (Minus) node[white] {$-$} circle (0.3);
\end{tikzpicture} \\
{\fontsize{8}{8}
\textit{Le sens des flèches est seulement indicative du sens du calcul de $P_{suivant}$. Ce n'est
pas le sens de la ligne de champ.}
}
\end{figure}
\noindent Le résultat est très concluant, quoique lent lorsque beaucoup de lignes doivent être déssinées. \textit{c.f. \ref{sec:time-evolution}}.
Comme les images le montre, les lignes sont clairement visible, mais il se peut que quelquefois il y aie des espaces
plus grand que d'autres entre les lignes. Ceci est dû à la manière dont les points de départ des lignes sont choisie.
Pour ne plus avoir ces espace, il serait possible de prendre des points de départ équidistant.
\begin{figure}[H]
\centering
\caption{Résultats de simulation}
\begin{subfigure}[t]{.3\linewidth}
\centering
\frame{\includegraphics[width=.7\linewidth]{figures/field-lines-2.png}}
\caption{2 particules}
\end{subfigure}
\begin{subfigure}[t]{.3\linewidth}
\centering
\frame{\includegraphics[width=.7\linewidth]{figures/field-lines-4.png}}
\caption{4 particules}
\end{subfigure}
\begin{subfigure}[t]{.3\linewidth}
\centering
\frame{\includegraphics[width=.7\linewidth]{figures/field-lines-6.png}}
\caption{6 particules}
\end{subfigure}
\end{figure}
\section{Champs vectoriel}
En plus des lignes de champs, deux autres représentations sont disponible. (Chacune en appuyant sur
\verb|l|, \verb|v|, \verb|h|). La première est un champs vectoriel. Il est généré de la façon suivante :
\begin{enumerate}
\item Calcul de la valeur minimum et maximum du champs électrostatique normalisé pour tout $P$
dans une grille orthogonale à espacement égale, et sauvegarde du champs en $P$
inséré dans une liste de longueur identique aux points de la grille.
\item Assignation de $P = P_0$
\item Pour tout $P$ dans la liste de champs électrostatique calculée à l'étape 1.
\item On normalise le champs $\hat{E} = \frac{\vec{E}(P)}{||\vec{E}(P)||}$ et on le multiplie par une valeur fixe
permettant de correctement distinguer les différentes tailles de vecteurs.
\item On dessine le vecteur en $P$.
\item Assignation de $P = P_{i + 1}$ et on revient à l'étape 4.
\end{enumerate}
\begin{figure}[H]
\centering
\caption{Dessin d'un champs vectoriel}
\begin{tikzpicture}[vecline/.style={green!50!black, ->, thick}, scale=.7]
\coordinate (Plus) at (0, 0);
\newcommand{\VSA}{0.5}
\newcommand{\VA}{1.15}
\newcommand{\VSB}{1.5}
\newcommand{\VB}{2}
\newcommand{\VSC}{2.5}
\newcommand{\VC}{2.8}
\filldraw (Plus) node[white] {$+$} circle (0.3);
% Right
\draw[vecline] (\VSA, 0) -- (\VA, 0);
\draw[vecline] (\VSB, 0) -- (\VB, 0);
\draw[vecline] (\VSC, 0) -- (\VC, 0);
% Left
\draw[vecline] (-\VSA, 0) -- (-\VA, 0);
\draw[vecline] (-\VSB, 0) -- (-\VB, 0);
\draw[vecline] (-\VSC, 0) -- (-\VC, 0);
% Up
\draw[vecline] (0, \VSA) -- (0, \VA);
\draw[vecline] (0, \VSB) -- (0, \VB);
\draw[vecline] (0, \VSC) -- (0, \VC);
% Down
\draw[vecline] (0, -\VSA) -- (0, -\VA);
\draw[vecline] (0, -\VSB) -- (0, -\VB);
\draw[vecline] (0, -\VSC) -- (0, -\VC);
% Up Right
\draw[vecline] (45:\VSA) -- (45:\VA);
\draw[vecline] (45:\VSB) -- (45:\VB);
\draw[vecline] (45:\VSC) -- (45:\VC);
% Up Left
\draw[vecline] (45:-\VSA) -- (45:-\VA);
\draw[vecline] (45:-\VSB) -- (45:-\VB);
\draw[vecline] (45:-\VSC) -- (45:-\VC);
% Down Right
\draw[vecline] (-45:\VSA) -- (-45:\VA);
\draw[vecline] (-45:\VSB) -- (-45:\VB);
\draw[vecline] (-45:\VSC) -- (-45:\VC);
% Down Left
\draw[vecline] (-45:-\VSA) -- (-45:-\VA);
\draw[vecline] (-45:-\VSB) -- (-45:-\VB);
\draw[vecline] (-45:-\VSC) -- (-45:-\VC);
\end{tikzpicture}
\end{figure}
\noindent Le résultant que quelque peu décevant sur un point précis. Les vecteur déssinés auraient pu
être plus précis car quelque fois leur taille est trop différente des vecteur voisins, et de ce fait,
créer une représentation un peu erronée.
\begin{figure}[H]
\centering
\caption{Résultats de simulation}
\begin{subfigure}[t]{.4\linewidth}
\centering
\frame{\includegraphics[width=.7\linewidth]{figures/vector-field-6.png}}
\caption{6 particules}
\end{subfigure}
\begin{subfigure}[t]{.4\linewidth}
\centering
\frame{\includegraphics[width=.7\linewidth]{figures/vector-field-12.png}}
\caption{12 particules}
\end{subfigure}
\end{figure}
\section{Heatmap}
La dernière représentation graphique est une heatmap en fonction de l'intensité du champs en tout point
de l'univers.
\begin{enumerate}
\item Cacule de la valeur minimum et maximum de la norme du champs électrostatique normalisé pour tout les
pixels de l'écran, et sauvegarde de la valeur courante dans une liste de longueur $largeur \cdot hauteur$.
\item Assignation de $P = P_0$.
\item Pour tout $I$ dans la liste d'intensitées sauvegardée à l'étape 1.
\item On dessine un point de couleur en fonction de l'intensité en ce point.
\item Assignation de $I = I_{i + 1}$ et on revient à l'étape 3.
\end{enumerate}
\begin{figure}[h]
\centering
\caption{Dessin d'une heatmap}
\begin{tikzpicture}[scale=.7]
\filldraw (0, 0) node[white] {$+$} circle (0.3);
\draw[blue] (0, 0) circle (0.5);
\draw[blue!80] (0, 0) circle (0.8);
\draw[blue!60] (0, 0) circle (1.2);
\draw[blue!40] (0, 0) circle (1.8);
\draw[blue!20] (0, 0) circle (2.8);
\end{tikzpicture}
\end{figure}
\noindent Cette représentation est selon moi la mieux réussie. Combinée aux lignes de champs, il est possible
de voir la puissance du champs électrostatique autour des charges ainsi que leur impact sur leur voisinage, ce qui
est très utile pour avoir une idée macroscoptique du champs. Cependant, le cacul du rendu graphique reste très lent.
Ceci est dû au fait qu'un calcul d'intensité du champs est fait pour tout pixel.
\begin{figure}[h]
\centering
\caption{Résultats de simulation}
\begin{subfigure}[t]{.4\linewidth}
\centering
\frame{\includegraphics[width=.7\linewidth]{figures/heatmap-6.png}}
\caption{6 particules}
\end{subfigure}
\begin{subfigure}[t]{.4\linewidth}
\centering
\frame{\includegraphics[width=.7\linewidth]{figures/heatmap-12.png}}
\caption{12 particules}
\end{subfigure}
\end{figure}
\section{Rendu graphique}
L'utilisation de la librairie graphique OpenGL a été privilégié de part son efficacité de rendu
ainsi que sa flexibilité d'utilisation. Grâce à cela, il a été possible d'afficher du texte
en dessous des particules indicant leur charge respective, utilisation d'antialiasing par défaut
pour un rendu de ligne et de cercle très bon, et calcul graphique fait sur le GPU au lieu du CPU.
\ No newline at end of file
......@@ -12,7 +12,7 @@ j'utilise deux lois de l'électrostatique qui sont la loi de Coulomb et les cham
Pour rappel, toute particule à une charge $Q$ valant $\pm n \cdot e$, où $e = 1.602176634 * 10^{-19}[C]$.
}
\section*{Loi de Coulomb}
\section{Loi de Coulomb}
Cette loi nous dis que :
\begin{center}
......@@ -38,7 +38,7 @@ $q$ et $Q$ est :
Dans le SI, $k_0 = \frac{1}{4 \pi \epsilon_0} \approx 8.987551792*10^{-9} [Nm^2C^{-2}]$
\end{center}
\section*{Champ électrique}
\section{Champ électrique}
Le champ électrique, $\vec{E}$, en newton par coulomb, ou volt par mètre, est un champ vectoriel
pouvant être défini en tout point, excepté sur la position de la charge.
......@@ -52,7 +52,7 @@ charge émettant le champ.
\end{equation}
\end{center}
\subsection*{Lignes de champs}
\section{Lignes de champs}
Les lignes de champs sont utiles afin de visualiser le champs électrique. Ces lignes commencent
sur des charges négatives et terminent sur des charges positives.
......@@ -64,7 +64,8 @@ Soit une collection de $N$ charges de charge $q_i$, le champ en $P_{n+1}$ est :
\begin{center}
\begin{equation}
\vec{E}(\vec{P}_{n+1}) = \vec P_n + \sum_{i=1}^N E_i \frac{\lvec{q_i P_n}}{||\lvec{q_i P_n}||}
\label{eqn:next-point}
\vec{E}(\vec{P}_{n+1}) = \vec P_n+ \sum_{i=1}^N E_i \frac{\lvec{q_i P_n}}{||\lvec{q_i P_n}||}
\end{equation}
\end{center}
......
......@@ -39,8 +39,8 @@
\input{mainmatter/introduction}
\input{mainmatter/chapter-2}
\input{mainmatter/chapter-3}
\input{mainmatter/theory}
\input{mainmatter/experiences}
%\input{mainmatter/chapter-4} % Create file to add
\input{mainmatter/conclusion}
......