Skip to content
Snippets Groups Projects
Commit 2e3f8003 authored by Peter Gerwinski's avatar Peter Gerwinski
Browse files

Praktikumsunterlagen: Versuch 3

parent 5377429f
No related branches found
No related tags found
No related merge requests found
File added
% hp-2024ws-p3.pdf - Labor Notes on Low-Level Programming
% Copyright (C) 2014, 2015, 2018-2022, 2024 Peter Gerwinski
%
% This document is free software: you can redistribute it and/or
% modify it either under the terms of the Creative Commons
% Attribution-ShareAlike 3.0 License, or under the terms of the
% GNU General Public License as published by the Free Software
% Foundation, either version 3 of the License, or (at your option)
% any later version.
%
% This document is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with this document. If not, see <http://www.gnu.org/licenses/>.
%
% You should have received a copy of the Creative Commons
% Attribution-ShareAlike 3.0 Unported License along with this
% document. If not, see <http://creativecommons.org/licenses/>.
% README: Versuch 3: Weltraum-Simulation
\documentclass[a4paper]{article}
\usepackage{pgscript}
\usepackage{multicol}
%\usepackage{sfmath}
\sloppy
\raggedcolumns
\pagestyle{empty}
\addtolength{\textheight}{1cm}
\newcommand{\sep}{~$\cdot$~}
\newcommand{\mylicense}{CC BY-SA (Version 4.0) oder GNU GPL (Version 3 oder höher)}
\begin{document}
\makebox(0,0.005)[tl]{\includegraphics[scale=0.72]{logo-hochschule-bochum-cvh-text-v2.pdf}}\hfill
\makebox(0,0)[tr]{\includegraphics[scale=0.5]{logo-hochschule-bochum.pdf}}
\par\bigskip\bigskip
\begin{center}
\Large\textbf{Praktikumsversuch 3: Weltraum-Simulation}
\par\medskip
\normalsize Hardwarenahe Programmierung\sep
Wintersemester 2024/25\sep
Prof.~Dr.~Peter Gerwinski
\end{center}
Aufgabe: Schreiben Sie ein C-Programm,
das die Bahnen von beliebig vielen Massenpunkten unter Einfluß der Gravitation
simuliert und in bewegter Grafik darstellt.
\begin{multicols}{2}
\begin{itemize}
\item
Zwei Massenpunkte ("`Himmelskörper"') mit den Massen $m_i$ und $m_j$
an den Orten $\vec{r}_i$ und $\vec{r}_j$ ziehen einander an.
Diese Kraft heißt Gravitation. Sie hat den Betrag:
\begin{equation}
|\vec{F}_{ij}| = \frac{m_j\cdot m_i\cdot G}{|\vec{r}_j - \vec{r}_i|^2}
\end{equation}
Hierbei ist $G$ eine Konstante (Gravitationskonstante).
\item
Die auf einen Himmelskörper wirkende Gesamtkraft $\vec{F}_i$
ergibt sich als Summe der von allen anderen Himmelskörpern herrührenden
Gravitationskräfte:
\begin{equation}
\vec{F}_i = \sum_{j=0,\,j\ne i}^{N - 1} \vec{F}_{ij}
\end{equation}
\item
Die Gravitationskraft beschleunigt jeden Himmelskörper gemäß:
\begin{equation}
\vec{F_i} = m_i\cdot \vec{a_i}
\end{equation}
\item
Beispiel: Wir betrachten zwei Himmelskörper. Einer davon ("`Zentralgestirn"')
ruht im Zentrum ($\vec{r}_0 = 0$, $\vec{v}_0 = 0$)
und hat eine wesentlich größere Masse als der andere
("`Satellit"', $m_1 \ll m_0$). Mit geeignetem Anfangsort $\vec{r}_1$
und geeigneter Anfangsgeschwindigkeit $\vec{v}_1$ beschreibt dann
der Satellit eine elliptische Umlaufbahn um das Zentralgestirn.
\item
Wir rechnen in zwei Dimensionen $x$ und $y$.
\item
Für die Zerlegung einer Kraft $\vec{F}_{ij}$ in $x$- und $y$-Komponenten
benötigen Sie nur die Grundrechenarten und die Wurzelfunktion,
jedoch insbesondere \emph{keine} trigonometrischen Funktionen:
\begin{equation}
\vec{F}_{ij} = |\vec{F}_{ij}| \cdot \frac{\vec{r}_j - \vec{r}_i}{|\vec{r}_j - \vec{r}_i|}
\end{equation}
\item
Die Wurzelfunktion \lstinline{sqrt()} finden Sie
in der Mathematik-Bibliothek.
Um diese zu nutzen, verwenden Sie \lstinline{#include <math.h>} im Quelltext,
und geben Sie beim \lstinline[style=cmd]{gcc}-Aufruf
\lstinline[style=cmd]{-lm} mit an.
\item
Speichern Sie die verschiedenen Körper nicht als separate Variable,
sondern in einem Array. Ihr Programm wird dadurch nicht nur flexibler,
sondern auch übersichtlicher und weniger fehleranfällig.
% \columnbreak
\item
Für die Simulation betrachten wir das System in kurzen Zeitintervallen $dt$
und berechnen die Änderungen des Ortes $\vec{r}_i = (x_i,y_i)$
und der Geschwindigkeit $\vec{v}_i = (v_{xi},v_{yi})$ jedes Himmelskörpers
mit Hilfe des expliziten Eulerschen Polygonzugverfahrens.
\par
(Wer möchte, darf natürlich auch andere Verfahren anwenden,
beispielsweise das klassische Runge-Kutta-Verfahren 4.~Ordnung.)
\item
Für eine derartige Simulation
einschließlich ihrer Darstellung als bewegte Grafik
können Sie sich von dem Beispiel-Programm \gitfile{hp}{2022ws/20221114}{pendulum-1.c}
inspirieren lassen.
% (Compilieren mit:
% \lstinline[style=cmd]{gcc}
% \lstinline[style=cmd]{-Wall}
% \lstinline[style=cmd]{-O}
% \lstinline[style=cmd]{gtk-16.c}
% \lstinline[style=cmd]{$(pkg-config}
% \lstinline[style=cmd]{--cflags}
% \lstinline[style=cmd]{--libs}
% \lstinline[style=cmd]{gtk+-3.0)}
% \lstinline[style=cmd]{-o}
% \lstinline[style=cmd]{gtk-16})
\item
In einer \file{GTK+}-\lstinline{drawing_area}
liegt der Nullpunkt der Zeichnung oben links,
eine Längeneinheit entspricht einem Pixel,
und die $y$-Koordinate wächst nach unten.
Es empfiehlt sich, die Koordinaten so umzurechnen,
daß der Nullpunkt in der Mitte der Zeichnung liegt,
die Längeneinheit Ihrem persönlichen Geschmack entspricht
und die $y$-Koordinate nach oben wächst.
\item
Beispiel-Szenarien für 3 oder mehr Körper:
\vspace{-\smallskipamount}
\begin{itemize}\itemsep0pt
\item
Planet mit Mond umkreist Sonne
\item
Sonne mit mehreren Planeten, die sich gegenseitig beeinflussen
\item
zwei Sonnen umkreisen sich gegenseitig, Planet kreist drumherum
\item
Raumsonde besucht nacheinander mehrere Planeten
\end{itemize}
\end{itemize}
\end{multicols}
\bigskip
\textbf{GTK unter GNU/Linux}
\begin{itemize}
\item
Installieren Sie das Entwickler-Paket für GTK-3,\\
z.\,B.\ unter Debian GNU/Linux und darauf basierenden Systemen:
\begin{lstlisting}[style=cmd,gobble=8]
apt-get install libgtk-3-dev
\end{lstlisting}
\end{itemize}
\bigskip
\goodbreak
\textbf{GTK unter MacOS X}
\begin{itemize}
\item
Zuerst den Paketmanager "`Homebrew"' installieren:
\begin{lstlisting}[style=cmd,gobble=8]
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/
Homebrew/install/2020ws/install)"
\end{lstlisting}
(Die URL nicht trennen, sondern in einer Zeile schreiben.)
\item
Danach mit Hilfe von \lstinline[style=cmd]{brew} GTK installieren:
\begin{lstlisting}[style=cmd,gobble=8]
brew install gtk+3
\end{lstlisting}
\end{itemize}
\bigskip
\goodbreak
\textbf{GTK unter Microsoft Windows: Cygwin}
\begin{itemize}
\item
Im Cygwin-Setup-Programm die Pakete \file{libgtk3-devel},
\file{xorg-server} und \file{dbus-x11} installieren.
\item
Bevor Sie GTK-Programme starten können,
müssen Sie einmalig den X-Server starten:
\begin{lstlisting}[style=cmd,gobble=8]
XWin -multiwindow &
\end{lstlisting}
\item
Bevor Sie GTK-Programme starten können,
müssen Sie einmalig pro Shell-Sitzung\\
die \lstinline[style=cmd]{DISPLAY}-Variable setzen:
\begin{lstlisting}[style=cmd,gobble=8]
export DISPLAY=:0.0
\end{lstlisting}
\end{itemize}
\bigskip
\goodbreak
\textbf{GTK unter Microsoft Windows: MinGW}
\begin{itemize}
\item
Installieren Sie \file{MSYS2} (Installer).
\item
Installieren Sie von der MinGW-Shell aus GTK
und weitere Entwicklungswerkzeuge:
\begin{lstlisting}[style=cmd,gobble=8]
pacman -S mingw-w64-x86_64-gcc
pacman -S mingw-w64-x86_64-gtk3
pacman -S mingw-w64-x86_64-pkg-config
\end{lstlisting}
\item
Falls nötig, ergänzen Sie in der MinGW-Shell
den Pfad zu den neu installierten Programmen:
\begin{lstlisting}[style=cmd,gobble=8]
export PATH=$PATH:/mingw64/bin
\end{lstlisting}
\end{itemize}
\bigskip
\goodbreak
\textbf{GTK unter Microsoft Windows: WSL}
\begin{itemize}
\item
Installieren Sie die GTK-Entwicklungswerkzeuge in ihrer Linux-Umgebung (siehe oben).
\item
Installieren Sie einen X-Server für Ihr MS-Windows-System, z.\,B.\ \file{Xming}.
\item
Starten Sie Ihren X-Server mit \file{XLaunch}
und wählen Sie \emph{no access control} aus.
\item
Bevor Sie GTK-Programme starten können,
müssen Sie einmalig pro Shell-Sitzung\\
die \lstinline[style=cmd]{DISPLAY}-Variable setzen:
\begin{lstlisting}[style=cmd,gobble=8]
export DISPLAY=$(cat /etc/resolv.conf \
| grep nameserver | awk '{print $2}'):0
\end{lstlisting}
(Der Backslash ist ein Zeilen-Verlängerungszeichen. Wenn Sie den gesamten\\
Befehl in einer Zeile eingeben, entfällt der Backslash.)
\end{itemize}
\vspace*{-\bigskipamount}
\strut\hfill\emph{Viel Erfolg!}\qquad\qquad
\vfill
\begingroup
\small
\setlength{\leftskip}{3cm}
Stand: 12.\ Dezember 2024
% Soweit nicht anders angegeben:\\
Copyright \copyright\ 2014, 2015, 2018-2022, 2024\quad Peter Gerwinski\\
Lizenz: \mylicense
Sie können diese Praktikumsunterlagen einschließlich \LaTeX-Quelltext
und Beispielprogramm herunterladen unter:
\url{https://gitlab.cvh-server.de/pgerwinski/hp}
\endgroup
\end{document}
...@@ -63,6 +63,7 @@ Praktikumsunterlagen: ...@@ -63,6 +63,7 @@ Praktikumsunterlagen:
--------------------- ---------------------
* [Versuch 1: RSA-Verschlüsselung](https://gitlab.cvh-server.de/pgerwinski/hp/raw/2024ws/20241017/hp-2024ws-p1.pdf) * [Versuch 1: RSA-Verschlüsselung](https://gitlab.cvh-server.de/pgerwinski/hp/raw/2024ws/20241017/hp-2024ws-p1.pdf)
* [Versuch 2: Druckknopfampel](https://gitlab.cvh-server.de/pgerwinski/hp/raw/2024ws/20241121/hp-2024ws-p2.pdf) * [Versuch 2: Druckknopfampel](https://gitlab.cvh-server.de/pgerwinski/hp/raw/2024ws/20241121/hp-2024ws-p2.pdf)
* [Versuch 3: Weltraum-Simulation](https://gitlab.cvh-server.de/pgerwinski/hp/raw/2024ws/20241212/hp-2024ws-p3.pdf)
Alte Klausuren: Alte Klausuren:
--------------- ---------------
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment