Merge branch 'master' of whale.am28.uni-tuebingen.de:scientificComputing

This commit is contained in:
2016-12-12 18:48:15 +01:00
81 changed files with 1527 additions and 473 deletions

View File

@@ -0,0 +1,8 @@
function y = boltzmann( x, k )
% computes the boltzmann function
% x: scalar or vector of x values
% k: slope parameter of boltzman function
% returns y-values of boltzmann function
y = 1./(1+exp(-k*x));
end

View File

@@ -0,0 +1,3 @@
p = boltzmann(voltage, a);
plot(voltage, p)
y = -1;

View File

@@ -15,7 +15,7 @@
\usepackage[left=20mm,right=20mm,top=25mm,bottom=25mm]{geometry}
\pagestyle{headandfoot} \header{{\bfseries\large \"Ubung
3}}{{\bfseries\large Boolesche Ausdr\"ucke, logisches
Indizieren}}{{\bfseries\large 13. Oktober, 2015}}
Indizieren}}{{\bfseries\large 31. Oktober, 2016}}
\firstpagefooter{Dr. Jan Grewe}{Phone: 29 74588}{Email:
jan.grewe@uni-tuebingen.de} \runningfooter{}{\thepage}{}
@@ -41,8 +41,8 @@ Selbstkontrolle und sollten eigenst\"andig bearbeitet und gel\"ost
werden. Die L\"osung soll in Form eines einzelnen Skriptes (m-files)
im ILIAS hochgeladen werden. Jede Aufgabe sollte in einer eigenen
``Zelle'' gel\"ost sein. Die Zellen \textbf{m\"ussen} unabh\"angig
voneinander ausf\"uhrbar sein. Das Skript sollte nach dem Muster:
``variablen\_datentypen\_\{nachname\}.m'' benannt werden
voneinander ausf\"uhrbar sein. Das Skript sollte nach dem Muster:\newline
``boolesche\_ausdruecke\_\{nachname\}.m'' benannt werden
(z.B. variablen\_datentypen\_mueller.m).
\section{Boolesche Ausdr\"ucke}
@@ -77,14 +77,14 @@ voneinander ausf\"uhrbar sein. Das Skript sollte nach dem Muster:
\newpage
\section{Logische Indizierung}
Bollesche Ausdr\"ucke k\"onnen benutzt werden um aus Vektoren und
Boolesche Ausdr\"ucke k\"onnen benutzt werden um aus Vektoren und
Matrizen die Elemente herauszusuchen, die einem bestimmeten Kriterium
entsprechen.
\begin{questions}
\question Gegeben sind \verb+x = (1:10)+ und
\verb+y = [3 1 5 6 8 2 9 4 7 0]+. Versuche die Ausgaben folgender
Anweisungen zu verstehen.
Anweisungen zu verstehen. Erkl\"are die Ergebnisse.
\begin{parts}
\part \verb+x < 5+
\part \verb+x( x < 5) )+
@@ -99,10 +99,10 @@ entsprechen.
0 und 100 (\verb+randi+). Ersetze die Werte der Elemente, die in
folgende Klassen fallen: \verb+x < 33+ mit 0,
\verb+x >= 33 und x < 66+ mit 1 und alle \verb+x >= 66+ auf 2.
\part Ermittle die Anzahl Elemente fuer jede Klasse mithilfe eines
\part Ermittle die Anzahl Elemente f\"ur jede Klasse mithilfe eines
Booleschen Ausdrucks (\verb+sum+ kann eingesetzt werden um die
Anzahl Treffer zu ermitteln).
\end{parts}
\end{questions}
\end{document}
\end{document}

View File

@@ -14,7 +14,7 @@
%%%%% text size %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage[left=20mm,right=20mm,top=25mm,bottom=25mm]{geometry}
\pagestyle{headandfoot}
\header{{\bfseries\large \"Ubung 4}}{{\bfseries\large Kontrollstrukturen}}{{\bfseries\large 13. Oktober, 2015}}
\header{{\bfseries\large \"Ubung 4}}{{\bfseries\large Kontrollstrukturen}}{{\bfseries\large 08. November, 2016}}
\firstpagefooter{Dr. Jan Grewe}{Phone: 29 74588}{Email:
jan.grewe@uni-tuebingen.de}
\runningfooter{}{\thepage}{}
@@ -42,8 +42,8 @@ werden. Die L\"osung soll in Form eines einzelnen Skriptes (m-files)
im ILIAS hochgeladen werden. Jede Aufgabe sollte in einer eigenen
``Zelle'' gel\"ost sein. Die Zellen \textbf{m\"ussen} unabh\"angig
voneinander ausf\"uhrbar sein. Das Skript sollte nach dem Muster:
``variablen\_datentypen\_\{nachname\}.m'' benannt werden
(z.B. variablen\_datentypen\_mueller.m).
``control\_flow\_\{nachname\}.m'' benannt werden
(z.B. control\_flow\_mueller.m).
\begin{questions}
\question Implementiere \code{for} Schleifen bei denen die Laufvariable:

View File

@@ -0,0 +1,6 @@
n = 5;
x = 1;
for i = 1:n
x = x * i;
end
fprintf('Factorial of %i is: %i\n', n, x)

View File

@@ -0,0 +1 @@
printfaculty(5);

View File

@@ -0,0 +1,3 @@
n = 5
a = myfactorial(n);
fprintf('Factorial of %i is: %i\n', n, x)

View File

@@ -0,0 +1,7 @@
function x = mufactorial(n)
% return the factorial of n
x = 1;
for i = 1:n
x = x * i;
end
end

View File

@@ -0,0 +1,19 @@
function plotsine(freq, ampl, duration)
% plot a sine wave
% freq: frequency of the sinewave in Hertz
% ampl: amplitude of the sinewave
% duration: duration of the sinewave in seconds
step = 0.01/freq;
time = 0:step:duration;
sine = ampl*sin(2*pi*freq*time);
if duration <= 1.0
plot(1000.0*time, sine);
xlabel('Time [ms]');
else
plot(time, sine);
xlabel('Time [s]');
end
ylim([-1.2*ampl 1.2*ampl]);
ylabel('Sinewave');
title(sprintf('Frequency %g Hz', freq));
end

View File

@@ -0,0 +1,9 @@
function plotsine50()
% plot a sine wave of 50Hz
time = 0:0.0001:0.2;
sine = sin(2*pi*50.0*time);
plot(1000.0*time, sine);
xlabel('Time [ms]');
ylim([-1.2 1.2]);
ylabel('Sinewave');
end

View File

@@ -0,0 +1 @@
plotsine50()

View File

@@ -0,0 +1 @@
plotsine(5.0, 2.0, 1.5)

View File

@@ -0,0 +1,14 @@
freq = 5.0;
ampl = 2.0;
[time, sine] = sinewave(freq, ampl, 1.5);
if duration <= 1.0
plot(1000.0*time, sine);
xlabel('Time [ms]');
else
plot(time, sine);
xlabel('Time [s]');
end
ylim([-1.2*ampl 1.2*ampl]);
ylabel('Sinewave');
title(sprintf('Frequency %g Hz', freq));

View File

@@ -0,0 +1,4 @@
freq = 5.0;
ampl = 2.0;
[time, sine] = sinewave(freq, ampl, 1.5);
plotsinewave(time, sine);

View File

@@ -0,0 +1,13 @@
function plotsinewave(time, sine)
% plot precomputed sinewave
% time: vector with timepoints
% sine: corresponding vector with sinewave
if time(end)-time(1) <= 1.0
plot(1000.0*time, sine);
xlabel('Time [ms]');
else
plot(time, sine);
xlabel('Time [s]');
end
ylim([1.2*min(sine) 1.2*max(sine)]);
ylabel('Sinewave');

View File

@@ -0,0 +1,8 @@
function printfaculty(n)
% compute the faculty of n and print it
x = 1;
for i = 1:n
x = x * i;
end
fprintf('Factorial of %i is: %i\n', n, x)
end

View File

@@ -0,0 +1,13 @@
function [time, position] = randomwalk(numbersteps)
% 1-D random walk for numbersteps time steps
time = 1:numbersteps;
position = zeros(numbersteps, 1);
for i = time(2:end)
r = rand(1);
if r > 0.5
position(i) = position(i-1) + 1;
else
position(i) = position(i-1) - 1;
end
end
end

View File

@@ -0,0 +1,7 @@
n = 2000;
hold on
for k = 1:10
[t, x] = randomwalk(n);
plot(t, x)
end
hold off

View File

@@ -0,0 +1,8 @@
p = 0.5;
thresh = 50.0;
hold on
for k = 1:10
x = randomwalkthresh(p, thresh);
plot(x)
end
hold off

View File

@@ -0,0 +1,20 @@
thresh = 50.0;
probs = [0.5 0.52 0.55 0.6];
maxt = 0;
for sp = 1:4
p = probs(sp);
subplot(2, 2, sp);
hold on
for k = 1:10
x = randomwalkthresh(p, thresh);
if maxt < length(x)
maxt = length(x);
end
plot(x)
end
hold off
title(sprintf('p=%g', p))
xlabel('Time')
xlim([0 maxt])
ylabel('Position')
end

View File

@@ -0,0 +1,23 @@
thresh = 50.0;
probs = 0.5:0.01:1.0;
reps = 1000;
meancount = zeros(length(probs), 1);
stdcount = zeros(length(probs), 1);
for sp = 1:length(probs)
p = probs(sp);
positions = zeros(reps, 1);
for k = 1:reps
x = randomwalkthresh(p, thresh);
positions(k) = length(x);
end
meancount(sp) = mean(positions);
stdcount(sp) = std(positions);
end
semilogy(probs, meancount, 'displayname', 'mean');
hold on;
semilogy(probs, stdcount, 'displayname', 'std');
hold off;
xlabel('p');
xlim([0.5 1.0])
ylabel('number of steps');
legend('show');

View File

@@ -0,0 +1,24 @@
function positions = randomwalkthresh(p, thresh)
% computes a single random walk
%
% Arguments:
% p: the probability for an upward step
% thresh: compute the random walk until abs(pos) is larger than thresh
%
% Returns:
% positions: vector with positions of the random walker
positions = [0.0];
% positions = 0.0;
% positions = zeros(1, 1);
i = 2;
while abs(positions(i-1)) < thresh
r = rand(1);
if r < p
positions(i) = positions(i-1) + 1;
else
positions(i) = positions(i-1) - 1;
end
i = i + 1;
end
end

View File

@@ -1,7 +1,9 @@
\documentclass[12pt,a4paper,pdftex]{exam}
%\documentclass[answers,12pt,a4paper,pdftex]{exam}
\usepackage[german]{babel}
\usepackage{natbib}
\usepackage{xcolor}
\usepackage{graphicx}
\usepackage[small]{caption}
\usepackage{sidecap}
@@ -14,9 +16,9 @@
%%%%% text size %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage[left=20mm,right=20mm,top=25mm,bottom=25mm]{geometry}
\pagestyle{headandfoot}
\header{{\bfseries\large \"Ubung 4}}{{\bfseries\large Skripte und Funktionen}}{{\bfseries\large 14. Oktober, 2015}}
\firstpagefooter{Dr. Jan Grewe}{Phone: 29 74588}{Email:
jan.grewe@uni-tuebingen.de}
\header{{\bfseries\large \"Ubung 5}}{{\bfseries\large Skripte und Funktionen}}{{\bfseries\large 15. November, 2016}}
\firstpagefooter{Prof. Jan Benda}{Phone: 29 74 573}{Email:
jan.benda@uni-tuebingen.de}
\runningfooter{}{\thepage}{}
\setlength{\baselineskip}{15pt}
@@ -24,6 +26,27 @@
\setlength{\parskip}{0.3cm}
\renewcommand{\baselinestretch}{1.15}
%%%%% listings %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage{listings}
\lstset{
language=Matlab,
basicstyle=\ttfamily\footnotesize,
numbers=left,
numberstyle=\tiny,
title=\lstname,
showstringspaces=false,
commentstyle=\itshape\color{darkgray},
breaklines=true,
breakautoindent=true,
columns=flexible,
frame=single,
xleftmargin=1em,
xrightmargin=1em,
aboveskip=10pt
}
\newcommand{\code}[1]{\texttt{#1}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -45,89 +68,152 @@ also als zip-Archiv auf ILIAS hochladen. Das Archiv sollte nach dem Muster:
\begin{questions}
\question Implementiere die Fakult\"at als Funktion.
\question Berechne die Fakult\"at einer Zahl.
\begin{parts}
\part Version 1: berechnet die Fakult\"at von 5 und gib das
Resultat auf dem Bildschirm aus.
\part Version 2: Wie 1 aber die Funktion \"ubernimmt als Argument
die Zahl, von der die Fakult\"at berechnet werden soll.
\part Version 3: Wie 2 aber mit R\"uckgabe des berechneten Wertes.
\part Version 1: Schreibe eine Skript, das die Fakult\"at von 5 berechnet und das
Resultat auf dem Bildschirm ausgibt.
\begin{solution}
\lstinputlisting{factorialscripta.m}
\end{solution}
\part Version 2: Wie Version 1, aber als Funktion, die als
Argument die Zahl, von der die Fakult\"at berechnet werden soll,
\"ubernimmt.
\begin{solution}
\lstinputlisting{printfactorial.m}
\lstinputlisting{factorialscriptb.m}
\end{solution}
\part Version 3: Wie Version 2, die Funktion soll den berechneten
Wert nicht ausgeben, sondern als Funktionswert zur\"uckgeben. Das
aufrufende Skript soll dann den berechneten Wert auf dem
Bildschirm ausgeben.
\begin{solution}
\lstinputlisting{myfactorial.m}
\lstinputlisting{factorialscriptc.m}
\end{solution}
\end{parts}
\question Implementiere eine Funktion, die einen Sinus mit der
Amplitude 1 und der Frequenz $f = $ 50\,Hz plottet ($sin(2\pi \cdot
f \cdot t)$):
\question Grafische Darstellung einer Sinuswelle.
\begin{parts}
\part Erweitere die Funktion sodass die L\"ange der Zeitachse, die
Schrittweite, Amplitude, Frequenz als Argumente
\"ubergeben werden k\"onnen.
\part Gib sowohl den Sinus als auch die Zeitachse zur\"uck.
\part Implementiere eine Funktion, die einen Sinus mit der
Amplitude 1 und der Frequenz $f = $ 50\,Hz plottet ($\sin(2\pi \cdot
f \cdot t)$). Rufe die Funktion auf.
\begin{solution}
\lstinputlisting{plotsine50.m}
\lstinputlisting{plotsinea.m}
\end{solution}
\part Erweitere die Funktion so, dass die L\"ange der Zeitachse,
die Amplitude, und die Frequenz als Argumente \"ubergeben werden
k\"onnen. Die Schrittweite soll in der Funktion aus der Frequenz
berechnet werden.
\begin{solution}
\lstinputlisting{plotsine.m}
\lstinputlisting{plotsineb.m}
\end{solution}
\part Verlagere alle plot Befehle in das aufrufende Skript
und ver\"andere die Funktion so, dass sie sowohl den Sinus als
auch die Zeitachse zur\"uckgibt.
\begin{solution}
\lstinputlisting{sinewave.m}
\lstinputlisting{plotsinec.m}
\end{solution}
\part Schreibe eine zweite Funktion, die den Sinus plotted und
daf\"ur die Zeitachse und den Sinus als Argument erh\"alt. Diese
Funktion soll die Achsen richtig beschriften. Schreibe ein kleines
Skript, dass beide Funktionen aufruft, um einen Sinus von 5\,Hz
mit der Amplitude 2 \"uber 1.5 Sekunden zu plotten.
\begin{solution}
\lstinputlisting{plotsinewave.m}
\lstinputlisting{plotsined.m}
\end{solution}
\end{parts}
\question Schreibe eine Funktion, die bin\"are Datens\"atze
('signal.bin' und 'signal2.bin' vom Montag) liest und die Daten als
Vektor zur\"uckgibt. Welche Argumente muss die Funktion
\"ubernehmen?
%\question Schreibe eine Funktion, die bin\"are Datens\"atze
%('signal.bin' und 'signal2.bin' vom Montag) liest und die Daten als
%Vektor zur\"uckgibt. Welche Argumente muss die Funktion
%\"ubernehmen?
\question Entwickle ein Programm, das einen 1-D random walk
simuliert. Das Programm soll folgendes leisten:
\begin{itemize}
\item Jede Simulation soll solange laufen, bis eine Abweichung vom
Startwert von $\pm$ 50 erreicht ist.
\item Es soll m\"oglich sein, die Wahrscheinlichkeit f\"ur eine der
beiden Richtungen zu variieren. Variiere im Bereich von 0.5 bis 0.9.
\end{itemize}
\question Random Walk.
\begin{parts}
\part \"Uberlege Dir ein geeignetes ``Programmlayout'' aus
Funktionen und Skripten.
\part Implementiere die L\"osung.
\part Simuliere 30 Realisationen des random walk pro
Wahrscheinlichkeit.
\part Es sollen die Positionen als Funktion der Schrittanzahl
geplottet werden. Erstelle einen Plot mit den je 30
Wiederholungen pro Wahrscheinlichkeitsstufe.
\part Lies die Aufgabe bis zum Ende durch. \"Uberlege dir dann ein
geeignetes ``Programmlayout'' aus Funktionen und Skripten.
Was w\"are eine geeigente Funktion f\"ur diese Aufgabe? Welche
Argumente sollte sie entgegennehmen? Was soll sie berechnen und
zur\"uckgeben?
\begin{solution}
One function that computes one realisation of a random walk.
Scripts for plotting and analysis.
\lstinputlisting{randomwalkthresh.m}
\end{solution}
\part Simuliere und plotte die Positionen von 10 Realisationen
eines random walk mit gleichen Wahrscheinlichkeiten f\"ur beide
Richtungen. Jeder Walker startet an der Position 0 und soll so
lange laufen, bis er den Wert 50 \"uberschreitet oder den Wert
$-50$ unterschreitet.
\begin{solution}
\lstinputlisting{randomwalkscriptb.m}
\end{solution}
\part Jetzt wollen wir die Wahrscheinlichkeit $p$ f\"ur eine
Bewegung zu gr\"o{\ss}eren Positionen im Bereich $0.5 \le p < 0.8$
variieren. Simuliere 10 Realisationen des random walk f\"ur vier
verschiedene Wahrscheinlichkeiten.
\begin{solution}
\lstinputlisting{randomwalkscriptc.m}
\end{solution}
\part Wie entwickelt sich die mittlere ben\"otigte Schrittanzahl
in Abh\"angigkeit der Wahrscheinlichkeit? Stelle die Mittelwerte
und die Standardabweichungen graphisch dar.
\begin{solution}
\lstinputlisting{randomwalkscriptd.m}
\end{solution}
\end{parts}
\question Modellierung des exponentiellen Wachstums einer isolierten
Population. Das exponentielle Wachstum einer isolierten Population
wird \"uber folgende Differentialgleichung beschrieben:
\begin{equation}
\frac{dN}{dt} = N \cdot r,
\end{equation}
mit $N$ der Populationsgr\"o{\ss}e und $r$ der Wachstumsrate.
\begin{parts}
\part L\"ose die Gleichung numerisch mit dem Euler Verfahren.
\part Implementiere eine Funktion, die die Populationsgr\"o{\ss}e
und die Zeit zur\"uckgibt.
\part Plotte die Populationsgr\"o{\ss}e als Funktion der Zeit.
\end{parts}
%\question Modellierung des exponentiellen Wachstums einer isolierten
%Population. Das exponentielle Wachstum einer isolierten Population
%wird \"uber folgende Differentialgleichung beschrieben:
%\begin{equation}
% \frac{dN}{dt} = N \cdot r,
%\end{equation}
%mit $N$ der Populationsgr\"o{\ss}e und $r$ der Wachstumsrate.
%\begin{parts}
% \part L\"ose die Gleichung numerisch mit dem Euler Verfahren.
% \part Implementiere eine Funktion, die die Populationsgr\"o{\ss}e
% und die Zeit zur\"uckgibt.
% \part Plotte die Populationsgr\"o{\ss}e als Funktion der Zeit.
%\end{parts}
\question Etwas realistischer ist das logistische Wachstum einer
isolierten Population, bei der das Wachstum durch eine Kapazit\"at
gedeckelt ist. Sie wird mit folgender Differentialgleichung
beschrieben:
\begin{equation}
\frac{dN}{dt} = N \cdot r \cdot \left( 1 - \frac{N}{K} \right)
\end{equation}
mit $N$ der Population, der Wachstumsrate $r$ und $K$ der ``tragenden''
Kapazit\"at.
\begin{parts}
\part Implementiere die L\"osung des logistischen Wachstums in
einer Funktion. Benutze das Euler Verfahren. Die Funktion soll die
Parameter $r$, $K$ sowie den Startwert von $N$ als Argumente
\"ubernehmen.
\part Die Funktion soll die Populationsgr\"o{\ss}e und die Zeit
zur\"uckgeben.
\part Simuliere das Wachstum mit einer Anzahl unterschiedlicher
Startwerte f\"ur $N$.
\part Stelle die Ergebnisse in einem Plot graphisch dar.
\part Plotte das Wachstum $dN/dt$ als Funktion der
Populationsgr\"o{\ss}e $N$.
\end{parts}
%\question Etwas realistischer ist das logistische Wachstum einer
%isolierten Population, bei der das Wachstum durch eine Kapazit\"at
%gedeckelt ist. Sie wird mit folgender Differentialgleichung
%beschrieben:
%\begin{equation}
% \frac{dN}{dt} = N \cdot r \cdot \left( 1 - \frac{N}{K} \right)
%\end{equation}
%mit $N$ der Population, der Wachstumsrate $r$ und $K$ der ``tragenden''
%Kapazit\"at.
%\begin{parts}
% \part Implementiere die L\"osung des logistischen Wachstums in
% einer Funktion. Benutze das Euler Verfahren. Die Funktion soll die
% Parameter $r$, $K$ sowie den Startwert von $N$ als Argumente
% \"ubernehmen.
% \part Die Funktion soll die Populationsgr\"o{\ss}e und die Zeit
% zur\"uckgeben.
% \part Simuliere das Wachstum mit einer Anzahl unterschiedlicher
% Startwerte f\"ur $N$.
% \part Stelle die Ergebnisse in einem Plot graphisch dar.
% \part Plotte das Wachstum $dN/dt$ als Funktion der
% Populationsgr\"o{\ss}e $N$.
%\end{parts}
\end{questions}
\end{document}
\end{document}

View File

@@ -0,0 +1,12 @@
function [time, sine] = sinewave(freq, ampl, duration)
% compute sine wave with time axis
% freq: frequency of the sinewave in Hertz
% ampl: amplitude of the sinewave
% duration: duration of the sinewave in seconds
% returns:
% time: vector of time points
% sine: corresponding vector with the sine wave
step = 0.01/freq;
time = 0:step:duration;
sine = ampl*sin(2*pi*freq*time);
end