diff --git a/bootstrap/exercises/Makefile b/bootstrap/exercises/Makefile new file mode 100644 index 0000000..27691d9 --- /dev/null +++ b/bootstrap/exercises/Makefile @@ -0,0 +1,34 @@ +TEXFILES=$(wildcard exercises??.tex) +EXERCISES=$(TEXFILES:.tex=.pdf) +SOLUTIONS=$(EXERCISES:exercises%=solutions%) + +.PHONY: pdf exercises solutions watch watchexercises watchsolutions clean + +pdf : $(SOLUTIONS) $(EXERCISES) + +exercises : $(EXERCISES) + +solutions : $(SOLUTIONS) + +$(SOLUTIONS) : solutions%.pdf : exercises%.tex instructions.tex + { echo "\\documentclass[answers,12pt,a4paper,pdftex]{exam}"; sed -e '1d' $<; } > $(patsubst %.pdf,%.tex,$@) + pdflatex -interaction=scrollmode $(patsubst %.pdf,%.tex,$@) | tee /dev/stderr | fgrep -q "Rerun to get cross-references right" && pdflatex -interaction=scrollmode $(patsubst %.pdf,%.tex,$@) || true + rm $(patsubst %.pdf,%,$@).[!p]* + +$(EXERCISES) : %.pdf : %.tex instructions.tex + pdflatex -interaction=scrollmode $< | tee /dev/stderr | fgrep -q "Rerun to get cross-references right" && pdflatex -interaction=scrollmode $< || true + +watch : + while true; do ! make -q pdf && make pdf; sleep 0.5; done + +watchexercises : + while true; do ! make -q exercises && make exercises; sleep 0.5; done + +watchsolutions : + while true; do ! make -q solutions && make solutions; sleep 0.5; done + +clean : + rm -f *~ *.aux *.log *.out + +cleanup : clean + rm -f $(SOLUTIONS) $(EXERCISES) diff --git a/bootstrap/exercises/UT_WBMW_Black_RGB.pdf b/bootstrap/exercises/UT_WBMW_Black_RGB.pdf new file mode 100644 index 0000000..9aed921 Binary files /dev/null and b/bootstrap/exercises/UT_WBMW_Black_RGB.pdf differ diff --git a/statistics/exercises/bootstrapmean.m b/bootstrap/exercises/bootstrapmean.m similarity index 100% rename from statistics/exercises/bootstrapmean.m rename to bootstrap/exercises/bootstrapmean.m diff --git a/statistics/exercises/bootstraptymus-datahist.pdf b/bootstrap/exercises/bootstraptymus-datahist.pdf similarity index 100% rename from statistics/exercises/bootstraptymus-datahist.pdf rename to bootstrap/exercises/bootstraptymus-datahist.pdf diff --git a/statistics/exercises/bootstraptymus-meanhist.pdf b/bootstrap/exercises/bootstraptymus-meanhist.pdf similarity index 100% rename from statistics/exercises/bootstraptymus-meanhist.pdf rename to bootstrap/exercises/bootstraptymus-meanhist.pdf diff --git a/statistics/exercises/bootstraptymus-samples.pdf b/bootstrap/exercises/bootstraptymus-samples.pdf similarity index 100% rename from statistics/exercises/bootstraptymus-samples.pdf rename to bootstrap/exercises/bootstraptymus-samples.pdf diff --git a/statistics/exercises/bootstraptymus.m b/bootstrap/exercises/bootstraptymus.m similarity index 100% rename from statistics/exercises/bootstraptymus.m rename to bootstrap/exercises/bootstraptymus.m diff --git a/statistics/exercises/correlationsignificance.m b/bootstrap/exercises/correlationsignificance.m similarity index 100% rename from statistics/exercises/correlationsignificance.m rename to bootstrap/exercises/correlationsignificance.m diff --git a/statistics/exercises/correlationsignificance.pdf b/bootstrap/exercises/correlationsignificance.pdf similarity index 100% rename from statistics/exercises/correlationsignificance.pdf rename to bootstrap/exercises/correlationsignificance.pdf diff --git a/statistics/exercises/statistics03.tex b/bootstrap/exercises/exercises01.tex similarity index 100% rename from statistics/exercises/statistics03.tex rename to bootstrap/exercises/exercises01.tex diff --git a/bootstrap/exercises/instructions.tex b/bootstrap/exercises/instructions.tex new file mode 100644 index 0000000..12e9e24 --- /dev/null +++ b/bootstrap/exercises/instructions.tex @@ -0,0 +1,41 @@ +\vspace*{-6.5ex} +\begin{center} +\textbf{\Large Einf\"uhrung in die wissenschaftliche Datenverarbeitung}\\[1ex] +{\large Jan Grewe, Jan Benda}\\[-3ex] +Abteilung Neuroethologie \hfill --- \hfill Institut f\"ur Neurobiologie \hfill --- \hfill \includegraphics[width=0.28\textwidth]{UT_WBMW_Black_RGB} \\ +\end{center} + +\ifprintanswers% +\else + +% Die folgenden Aufgaben dienen der Wiederholung, \"Ubung und +% 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 +% (z.B. variablen\_datentypen\_mueller.m). + +\begin{itemize} +\item \"Uberzeuge dich von jeder einzelnen Zeile deines Codes, dass + sie auch wirklich das macht, was sie machen soll! Teste dies mit + kleinen Beispielen direkt in der Kommandozeile. +\item Versuche die L\"osungen der Aufgaben m\"oglichst in + sinnvolle kleine Funktionen herunterzubrechen. + Sobald etwas \"ahnliches mehr als einmal berechnet werden soll, + lohnt es sich eine Funktion daraus zu schreiben! +\item Teste rechenintensive \code{for} Schleifen, Vektoren, Matrizen + zuerst mit einer kleinen Anzahl von Wiederholungen oder kleiner + Gr\"o{\ss}e, und benutze erst am Ende, wenn alles \"uberpr\"uft + ist, eine gro{\ss}e Anzahl von Wiederholungen oder Elementen, um eine gute + Statistik zu bekommen. +\item Benutze die Hilfsfunktion von \code{matlab} (\code{help + commando} oder \code{doc commando}) und das Internet, um + herauszufinden, wie bestimmte \code{matlab} Funktionen zu verwenden + sind und was f\"ur M\"oglichkeiten sie bieten. + Auch zu inhaltlichen Konzepten bietet das Internet oft viele + Antworten! +\end{itemize} + +\fi diff --git a/bootstrap/exercises/savefigpdf.m b/bootstrap/exercises/savefigpdf.m new file mode 100644 index 0000000..fbe2dc2 --- /dev/null +++ b/bootstrap/exercises/savefigpdf.m @@ -0,0 +1,28 @@ +function savefigpdf( fig, name, width, height ) +% Saves figure fig in pdf file name.pdf with appropriately set page size +% and fonts + +% default width: +if nargin < 3 + width = 11.7; +end +% default height: +if nargin < 4 + height = 9.0; +end + +% paper: +set( fig, 'PaperUnits', 'centimeters' ); +set( fig, 'PaperSize', [width height] ); +set( fig, 'PaperPosition', [0.0 0.0 width height] ); +set( fig, 'Color', 'white') + +% font: +set( findall( fig, 'type', 'axes' ), 'FontSize', 12 ) +set( findall( fig, 'type', 'text' ), 'FontSize', 12 ) + +% save: +saveas( fig, name, 'pdf' ) + +end + diff --git a/statistics/exercises/tdistribution-n03.pdf b/bootstrap/exercises/tdistribution-n03.pdf similarity index 100% rename from statistics/exercises/tdistribution-n03.pdf rename to bootstrap/exercises/tdistribution-n03.pdf diff --git a/statistics/exercises/tdistribution-n05.pdf b/bootstrap/exercises/tdistribution-n05.pdf similarity index 100% rename from statistics/exercises/tdistribution-n05.pdf rename to bootstrap/exercises/tdistribution-n05.pdf diff --git a/statistics/exercises/tdistribution-n10.pdf b/bootstrap/exercises/tdistribution-n10.pdf similarity index 100% rename from statistics/exercises/tdistribution-n10.pdf rename to bootstrap/exercises/tdistribution-n10.pdf diff --git a/statistics/exercises/tdistribution-n50.pdf b/bootstrap/exercises/tdistribution-n50.pdf similarity index 100% rename from statistics/exercises/tdistribution-n50.pdf rename to bootstrap/exercises/tdistribution-n50.pdf diff --git a/statistics/exercises/tdistribution.m b/bootstrap/exercises/tdistribution.m similarity index 100% rename from statistics/exercises/tdistribution.m rename to bootstrap/exercises/tdistribution.m diff --git a/statistics/exercises/thymusglandweights.dat b/bootstrap/exercises/thymusglandweights.dat similarity index 100% rename from statistics/exercises/thymusglandweights.dat rename to bootstrap/exercises/thymusglandweights.dat diff --git a/likelihood/exercises/Makefile b/likelihood/exercises/Makefile new file mode 100644 index 0000000..27691d9 --- /dev/null +++ b/likelihood/exercises/Makefile @@ -0,0 +1,34 @@ +TEXFILES=$(wildcard exercises??.tex) +EXERCISES=$(TEXFILES:.tex=.pdf) +SOLUTIONS=$(EXERCISES:exercises%=solutions%) + +.PHONY: pdf exercises solutions watch watchexercises watchsolutions clean + +pdf : $(SOLUTIONS) $(EXERCISES) + +exercises : $(EXERCISES) + +solutions : $(SOLUTIONS) + +$(SOLUTIONS) : solutions%.pdf : exercises%.tex instructions.tex + { echo "\\documentclass[answers,12pt,a4paper,pdftex]{exam}"; sed -e '1d' $<; } > $(patsubst %.pdf,%.tex,$@) + pdflatex -interaction=scrollmode $(patsubst %.pdf,%.tex,$@) | tee /dev/stderr | fgrep -q "Rerun to get cross-references right" && pdflatex -interaction=scrollmode $(patsubst %.pdf,%.tex,$@) || true + rm $(patsubst %.pdf,%,$@).[!p]* + +$(EXERCISES) : %.pdf : %.tex instructions.tex + pdflatex -interaction=scrollmode $< | tee /dev/stderr | fgrep -q "Rerun to get cross-references right" && pdflatex -interaction=scrollmode $< || true + +watch : + while true; do ! make -q pdf && make pdf; sleep 0.5; done + +watchexercises : + while true; do ! make -q exercises && make exercises; sleep 0.5; done + +watchsolutions : + while true; do ! make -q solutions && make solutions; sleep 0.5; done + +clean : + rm -f *~ *.aux *.log *.out + +cleanup : clean + rm -f $(SOLUTIONS) $(EXERCISES) diff --git a/likelihood/exercises/UT_WBMW_Black_RGB.pdf b/likelihood/exercises/UT_WBMW_Black_RGB.pdf new file mode 100644 index 0000000..9aed921 Binary files /dev/null and b/likelihood/exercises/UT_WBMW_Black_RGB.pdf differ diff --git a/statistics/exercises/statistics04.tex b/likelihood/exercises/exercises01.tex similarity index 100% rename from statistics/exercises/statistics04.tex rename to likelihood/exercises/exercises01.tex diff --git a/likelihood/exercises/instructions.tex b/likelihood/exercises/instructions.tex new file mode 100644 index 0000000..12e9e24 --- /dev/null +++ b/likelihood/exercises/instructions.tex @@ -0,0 +1,41 @@ +\vspace*{-6.5ex} +\begin{center} +\textbf{\Large Einf\"uhrung in die wissenschaftliche Datenverarbeitung}\\[1ex] +{\large Jan Grewe, Jan Benda}\\[-3ex] +Abteilung Neuroethologie \hfill --- \hfill Institut f\"ur Neurobiologie \hfill --- \hfill \includegraphics[width=0.28\textwidth]{UT_WBMW_Black_RGB} \\ +\end{center} + +\ifprintanswers% +\else + +% Die folgenden Aufgaben dienen der Wiederholung, \"Ubung und +% 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 +% (z.B. variablen\_datentypen\_mueller.m). + +\begin{itemize} +\item \"Uberzeuge dich von jeder einzelnen Zeile deines Codes, dass + sie auch wirklich das macht, was sie machen soll! Teste dies mit + kleinen Beispielen direkt in der Kommandozeile. +\item Versuche die L\"osungen der Aufgaben m\"oglichst in + sinnvolle kleine Funktionen herunterzubrechen. + Sobald etwas \"ahnliches mehr als einmal berechnet werden soll, + lohnt es sich eine Funktion daraus zu schreiben! +\item Teste rechenintensive \code{for} Schleifen, Vektoren, Matrizen + zuerst mit einer kleinen Anzahl von Wiederholungen oder kleiner + Gr\"o{\ss}e, und benutze erst am Ende, wenn alles \"uberpr\"uft + ist, eine gro{\ss}e Anzahl von Wiederholungen oder Elementen, um eine gute + Statistik zu bekommen. +\item Benutze die Hilfsfunktion von \code{matlab} (\code{help + commando} oder \code{doc commando}) und das Internet, um + herauszufinden, wie bestimmte \code{matlab} Funktionen zu verwenden + sind und was f\"ur M\"oglichkeiten sie bieten. + Auch zu inhaltlichen Konzepten bietet das Internet oft viele + Antworten! +\end{itemize} + +\fi diff --git a/statistics/exercises/mlepdffit.m b/likelihood/exercises/mlepdffit.m similarity index 100% rename from statistics/exercises/mlepdffit.m rename to likelihood/exercises/mlepdffit.m diff --git a/statistics/exercises/mlepdffit.pdf b/likelihood/exercises/mlepdffit.pdf similarity index 100% rename from statistics/exercises/mlepdffit.pdf rename to likelihood/exercises/mlepdffit.pdf diff --git a/statistics/exercises/mlepropfit.m b/likelihood/exercises/mlepropfit.m similarity index 100% rename from statistics/exercises/mlepropfit.m rename to likelihood/exercises/mlepropfit.m diff --git a/statistics/exercises/mlepropfit.pdf b/likelihood/exercises/mlepropfit.pdf similarity index 100% rename from statistics/exercises/mlepropfit.pdf rename to likelihood/exercises/mlepropfit.pdf diff --git a/statistics/exercises/mleslope.m b/likelihood/exercises/mleslope.m similarity index 100% rename from statistics/exercises/mleslope.m rename to likelihood/exercises/mleslope.m diff --git a/statistics/exercises/mlestd.m b/likelihood/exercises/mlestd.m similarity index 100% rename from statistics/exercises/mlestd.m rename to likelihood/exercises/mlestd.m diff --git a/statistics/exercises/mlestd.pdf b/likelihood/exercises/mlestd.pdf similarity index 100% rename from statistics/exercises/mlestd.pdf rename to likelihood/exercises/mlestd.pdf diff --git a/likelihood/exercises/savefigpdf.m b/likelihood/exercises/savefigpdf.m new file mode 100644 index 0000000..fbe2dc2 --- /dev/null +++ b/likelihood/exercises/savefigpdf.m @@ -0,0 +1,28 @@ +function savefigpdf( fig, name, width, height ) +% Saves figure fig in pdf file name.pdf with appropriately set page size +% and fonts + +% default width: +if nargin < 3 + width = 11.7; +end +% default height: +if nargin < 4 + height = 9.0; +end + +% paper: +set( fig, 'PaperUnits', 'centimeters' ); +set( fig, 'PaperSize', [width height] ); +set( fig, 'PaperPosition', [0.0 0.0 width height] ); +set( fig, 'Color', 'white') + +% font: +set( findall( fig, 'type', 'axes' ), 'FontSize', 12 ) +set( findall( fig, 'type', 'text' ), 'FontSize', 12 ) + +% save: +saveas( fig, name, 'pdf' ) + +end + diff --git a/likelihood/lecture/likelihood-chapter.tex b/likelihood/lecture/likelihood-chapter.tex index 2bcc35b..38d02d4 100644 --- a/likelihood/lecture/likelihood-chapter.tex +++ b/likelihood/lecture/likelihood-chapter.tex @@ -18,6 +18,11 @@ \section{TODO} \begin{itemize} +\item Fitting psychometric functions: + Variable $x_i$, responses $r_i$ either 0 or 1. + $p(x_i, \theta)$ is Weibull or Boltzmann function. + Likelihood is $L = \prod p(x_i, \theta)^{r_i} (1-p(x_i, \theta))^{1-r_i}$. + Use fminsearch for fitting. \item GLM model fitting? \end{itemize} diff --git a/pointprocesses/code/isiHist.m b/pointprocesses/code/isihist.m similarity index 75% rename from pointprocesses/code/isiHist.m rename to pointprocesses/code/isihist.m index 4f28f32..33ad4f5 100644 --- a/pointprocesses/code/isiHist.m +++ b/pointprocesses/code/isihist.m @@ -1,7 +1,7 @@ -function [pdf, centers] = isiHist(isis, binwidth) +function [pdf, centers] = isihist(isis, binwidth) % Compute normalized histogram of interspike intervals. % -% [pdf, centers] = isiHist(isis, binwidth) +% [pdf, centers] = isihist(isis, binwidth) % % Arguments: % isis: vector of interspike intervals in seconds @@ -14,15 +14,15 @@ function [pdf, centers] = isiHist(isis, binwidth) if nargin < 2 % compute good binwidth: nperbin = 200; % average number of data points per bin - bins = length( isis )/nperbin; % number of bins - binwidth = max( isis )/bins; + bins = length(isis)/nperbin; % number of bins + binwidth = max(isis)/bins; if binwidth < 5e-4 % half a millisecond binwidth = 5e-4; end end bins = 0.5*binwidth:binwidth:max(isis); % histogram data: - [ nelements, centers ] = hist(isis, bins); + [nelements, centers] = hist(isis, bins); % normalization (integral = 1): pdf = nelements / sum(nelements) / binwidth; end diff --git a/pointprocesses/code/isis.m b/pointprocesses/code/isis.m index b927abd..65a346b 100644 --- a/pointprocesses/code/isis.m +++ b/pointprocesses/code/isis.m @@ -1,7 +1,7 @@ -function isivec = isis( spikes ) +function isivec = isis(spikes) % returns a single list of isis computed from all trials in spikes % -% isivec = isis( spikes ) +% isivec = isis(spikes) % % Arguments: % spikes: a cell array of vectors of spike times in seconds @@ -12,9 +12,9 @@ function isivec = isis( spikes ) isivec = []; for k = 1:length(spikes) - difftimes = diff( spikes{k} ); + difftimes = diff(spikes{k}); % difftimes(:) ensures a column vector % regardless of the type of vector in spikes{k} - isivec = [ isivec; difftimes(:) ]; + isivec = [isivec; difftimes(:)]; end end diff --git a/pointprocesses/code/spikeraster.m b/pointprocesses/code/spikeraster.m index cde46dc..a20b0df 100644 --- a/pointprocesses/code/spikeraster.m +++ b/pointprocesses/code/spikeraster.m @@ -13,18 +13,17 @@ for k = 1:ntrials times = 1000.0*times; % conversion to ms end for i = 1:length( times ) - line([times(i) times(i)],[k-0.4 k+0.4], 'Color', 'k' ); + line([times(i) times(i)],[k-0.4 k+0.4], 'Color', 'k'); end end if tmax < 1.5 - xlabel( 'Time [ms]' ); + xlabel('Time [ms]'); xlim([0.0 1000.0*tmax]); else - xlabel( 'Time [s]' ); + xlabel('Time [s]'); xlim([0.0 tmax]); end -ylabel( 'Trials'); -ylim( [ 0.3 ntrials+0.7 ] ) - +ylabel('Trials'); +ylim([0.3 ntrials+0.7 ]); end diff --git a/pointprocesses/exercises/pointprocesses01.tex b/pointprocesses/exercises/pointprocesses01.tex index e537be7..ea8674d 100644 --- a/pointprocesses/exercises/pointprocesses01.tex +++ b/pointprocesses/exercises/pointprocesses01.tex @@ -98,8 +98,8 @@ jan.benda@uni-tuebingen.de} Mit den folgenden Aufgaben wollen wir die Statistik der Spiketrains der drei Neurone miteinander vergleichen. \begin{parts} - \part Lade die Spiketrains aus den drei Dateien. Achte darauf, dass sie verschiedene - Variablen\-namen bekommen. + \part Lade die Spiketrains aus den drei Dateien. Achte darauf, + dass sie verschiedene Variablen\-namen bekommen. \begin{solution} \begin{lstlisting} clear all diff --git a/pointprocesses/exercises/pointprocesses03.tex b/pointprocesses/exercises/pointprocesses03.tex new file mode 100644 index 0000000..31bb760 --- /dev/null +++ b/pointprocesses/exercises/pointprocesses03.tex @@ -0,0 +1,236 @@ +\documentclass[12pt,a4paper,pdftex]{exam} + +\usepackage[german]{babel} +\usepackage{pslatex} +\usepackage[mediumspace,mediumqspace,Gray]{SIunits} % \ohm, \micro +\usepackage{xcolor} +\usepackage{graphicx} +\usepackage[breaklinks=true,bookmarks=true,bookmarksopen=true,pdfpagemode=UseNone,pdfstartview=FitH,colorlinks=true,citecolor=blue]{hyperref} + +%%%%% layout %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\usepackage[left=20mm,right=20mm,top=25mm,bottom=25mm]{geometry} +\pagestyle{headandfoot} +\ifprintanswers +\newcommand{\stitle}{: L\"osungen} +\else +\newcommand{\stitle}{} +\fi +\header{{\bfseries\large \"Ubung 8\stitle}}{{\bfseries\large Spiketrain Analyse}}{{\bfseries\large 6. Dezember, 2016}} +\firstpagefooter{Prof. Dr. Jan Benda}{Phone: 29 74573}{Email: +jan.benda@uni-tuebingen.de} +\runningfooter{}{\thepage}{} + +\setlength{\baselineskip}{15pt} +\setlength{\parindent}{0.0cm} +\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 +} + +%%%%% math stuff: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{bm} +\usepackage{dsfont} +\newcommand{\naZ}{\mathds{N}} +\newcommand{\gaZ}{\mathds{Z}} +\newcommand{\raZ}{\mathds{Q}} +\newcommand{\reZ}{\mathds{R}} +\newcommand{\reZp}{\mathds{R^+}} +\newcommand{\reZpN}{\mathds{R^+_0}} +\newcommand{\koZ}{\mathds{C}} + +%%%%% page breaks %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\newcommand{\continue}{\ifprintanswers% +\else +\vfill\hspace*{\fill}$\rightarrow$\newpage% +\fi} +\newcommand{\continuepage}{\ifprintanswers% +\newpage +\else +\vfill\hspace*{\fill}$\rightarrow$\newpage% +\fi} +\newcommand{\newsolutionpage}{\ifprintanswers% +\newpage% +\else +\fi} + +%%%%% new commands %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\newcommand{\qt}[1]{\textbf{#1}\\} +\newcommand{\pref}[1]{(\ref{#1})} +\newcommand{\extra}{--- Zusatzaufgabe ---\ \mbox{}} +\newcommand{\code}[1]{\texttt{#1}} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{document} + +\input{instructions} + + +\begin{questions} + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \question \qt{Statistik von Spiketrains 2} + In Ilias findet ihr die Dateien \code{poisson.mat}, + \code{pifou.mat}, und \code{lifadapt.mat}. Jede dieser Dateien + enth\"alt mehrere Trials von Spiketrains von einer bestimmten Art + von Neuron. Die Spikezeiten sind in Sekunden gemessen. + + Mit den folgenden Aufgaben wollen wir die Statistik der Spiketrains + der drei Neurone miteinander vergleichen. + + Bereits im letzten \"Ubungszettel erstellte Funktionen d\"urfen (sollen!) + wiederverwendet werden. + \begin{parts} + \part Lade die Spiketrains aus den drei Dateien. Stelle sie in Rasterplots dar. + + \part Plotte die Interspike-Intervall Verteilungen. + + Annotiere die Plots mit dem Mittelwert, der + Standardabweichung, und dem Variationskoeffizienten der + Interspikeintervalle, sowie der mittleren Feuerrate. + + \part Vergleiche die ISI-Histogramme mit der ISI Verteilung eines Poisson Prozesses + der Rate $\lambda$: + \[ p(T) = \lambda e^{-\lambda T} \; .\] + + \part Erstelle Return-Maps f\"ur die drei Spiketrains, also jedes + Interspike-Intervall $T_{i+1}$ gegen das vorherige Intervall $T_i$ + geplottet. + + \part Schreibe eine Funktion, die die seriellen Korrelationen der + Interspikeintervalle f\"ur Lags bis zu \code{maxlag} berechnet und + plottet. Die Seriellen Korrelationen $\rho_k$ f\"ur Lag $k$ der + Interspikeintervalle $T_i$ sind die Korrelationskoeffizienten + zwischen den Interspikeintervallen $T_i$ und den um das Lag $k$ + verschobenen Intervallen $T_{i+k}$: + \[ \rho_k = \frac{\langle (T_{i+k} - \langle T \rangle)(T_i - + \langle T \rangle) \rangle}{\langle (T_i - \langle T + \rangle)^2\rangle} = \frac{{\rm cov}(T_{i+k}, T_i)}{{\rm + var}(T_i)} = {\rm corr}(T_{i+k}, T_i) \] + + Benutze diese Funktion, um die Interspikeintervall-Korrelationen + der drei Neurone zu vergleichen. + \begin{solution} + \lstinputlisting{../code/isiserialcorr.m} + \lstinputlisting{../code/plotserialcorr.m} + \colorbox{white}{\includegraphics[width=1\textwidth]{serialcorr}} + \end{solution} + + \end{parts} + + \continue + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \question \qt{Homogener Poisson Prozess} + Wir wollen den homogenen Poisson Prozess benutzen um Spikes zu + generieren, mit denen wir die Analysfunktionen des vorherigen + Aufgaben \"uberpr\"ufen k\"onnen. + + Ein homogener Poisson Prozess mit der Rate $\lambda$ (gemessen in + Hertz) ist ein Punktprozess, bei dem die Wahrscheinlichkeit eines + Ereignisses unabh\"angig von der Zeit $t$ und unabh\"angig von + vorherigen Ereignissen ist. Wenn wir die Zeitachse in kleine Bins + der Breite $\Delta t$ einteilen, dann ist + \[ P = \lambda \cdot \Delta t \] + die Wahrscheinlichkeit innerhalb eines Bins ein Ereignis (``spike'') + zu erhalten. $\Delta t$ muss daf\"ur klein genug sein, so dass $P<0.1$. + \begin{parts} + + \part Schreibe eine Funktion die $n$ homogene Poisson Spiketrains + einer gegebenen Dauer $T_{max}$ mit Rate $\lambda$ erzeugt. + + Falls das nicht gelingt, benutze f\"ur die folgenden Aufgaben + soweit m\"oglich spikes aus der Datei \code{poisson.mat}. + \begin{solution} + \lstinputlisting{hompoissonspikes.m} + \end{solution} + + \part Benutze diese Funktion um einige Trials von Spikes zu erzeugen + und plotte diese als Spikeraster. + \begin{solution} + \begin{lstlisting} + spikes = hompoissonspikes( 10, 100.0, 0.5 ); + spikeraster( spikes ) + \end{lstlisting} + \mbox{}\\[-3ex] + \colorbox{white}{\includegraphics[width=0.7\textwidth]{poissonraster100hz}} + \end{solution} + + \part Berechne Histogramme aus den Interspikeintervallen von $n$ + Poisson Spiketrains mit der Rate $\lambda=100$\,Hz. Wie viele bins + werden f\"ur ein ``sch\"ones'' ISI-Histogramm ungef\"ahr ben\"otigt? + Ver\"andere \"uber die Dauer $T_{max}$ der Spiketrains und die + Anzahl $n$ der Trials die Anzahl der Intervalle. Wieviele + Interspikeintervalle werden ben\"otigt, um ein ``sch\"ones'' + Histogramm zu erhalten? Wie lange m\"usste man also von dem Neuron + ableiten? + \begin{solution} + About 5000 intervals for 25 bins. This corresponds to a $5000 / + 100\,\hertz = 50\,\second$ recording of a neuron firing with + 100\,\hertz. + \end{solution} + + \part Vergleiche Interspike-Intervall Histogramme von Poisson-Spikes + verschiedener Raten $\lambda$ mit der theoretisch zu erwartenden Verteilung + der Intervalle $T$ des Poisson Prozesses + \[ p(T) = \lambda e^{-\lambda T} \; .\] + Achte darauf, dass die Bins des Histograms nicht kleiner als $\Delta t$ sind! + \begin{solution} + \lstinputlisting{hompoissonisih.m} + \colorbox{white}{\includegraphics[width=0.48\textwidth]{poissonisih100hz}} + \colorbox{white}{\includegraphics[width=0.48\textwidth]{poissonisih20hz}} + \end{solution} + + \part \extra Was passiert mit den Histogrammen, wenn die Binbreite + der Histogramme kleiner als das bei der Erzeugung der Poisson + Spiketrains verwendete $\Delta t$ ist? + \begin{solution} + Die Bins zwischen der durch $\Delta t$ vorgegebenen + Diskretisierung haben den Wert 0. Dadurch werden aber die anderen + durch die Normierung h\"oher als sie sein sollten. + \end{solution} + + \part Plotte den Mittelwert der Interspikeintervalle, die + dazugeh\"orige Standardabweichung und den Variationskoeffizienten + als Funktion der Rate $\lambda$ des Poisson Prozesses. Vergleiche + die Ergebnisse mit den theoretischen Erwartungen (siehe Vorlesungsskript). + \begin{solution} + \lstinputlisting{hompoissonisistats.m} + \colorbox{white}{\includegraphics[width=0.98\textwidth]{poissonisistats}} + \end{solution} + + \part Plotte die seriellen Korrelationen von Poisson-Spiketrains und + erkl\"are kurz das Ergebniss. + \begin{solution} + \mbox{}\\[-2ex]\hspace*{2cm} + \colorbox{white}{\includegraphics[width=0.8\textwidth]{poissonserial100hz}}\\ + Alle Korrelationen zwischen Interspikeintervallen sind Null, da + beim Poisson Prozess das Auftreten jedes Spikes unabh\"angig von + den vorherigen Spikes ist. + \end{solution} + + \end{parts} + + +\end{questions} + +\end{document} diff --git a/pointprocesses/lecture/pointprocessscetchA.eps b/pointprocesses/lecture/pointprocessscetchA.eps index 6159193..1dfe6f5 100644 --- a/pointprocesses/lecture/pointprocessscetchA.eps +++ b/pointprocesses/lecture/pointprocessscetchA.eps @@ -1,7 +1,7 @@ %!PS-Adobe-2.0 EPSF-2.0 %%Title: pointprocessscetchA.tex %%Creator: gnuplot 4.6 patchlevel 4 -%%CreationDate: Fri Sep 30 10:14:40 2016 +%%CreationDate: Sat Nov 19 10:17:42 2016 %%DocumentFonts: %%BoundingBox: 50 50 373 135 %%EndComments @@ -430,10 +430,10 @@ SDict begin [ /Title (pointprocessscetchA.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.6 patchlevel 4) - /Author (grewe) + /Author (jan) % /Producer (gnuplot) % /Keywords () - /CreationDate (Fri Sep 30 10:14:40 2016) + /CreationDate (Sat Nov 19 10:17:42 2016) /DOCINFO pdfmark end } ifelse diff --git a/pointprocesses/lecture/pointprocessscetchA.pdf b/pointprocesses/lecture/pointprocessscetchA.pdf index eb57b5b..b532798 100644 Binary files a/pointprocesses/lecture/pointprocessscetchA.pdf and b/pointprocesses/lecture/pointprocessscetchA.pdf differ diff --git a/pointprocesses/lecture/pointprocessscetchB.eps b/pointprocesses/lecture/pointprocessscetchB.eps index edfe69a..1856ba8 100644 --- a/pointprocesses/lecture/pointprocessscetchB.eps +++ b/pointprocesses/lecture/pointprocessscetchB.eps @@ -1,7 +1,7 @@ %!PS-Adobe-2.0 EPSF-2.0 %%Title: pointprocessscetchB.tex %%Creator: gnuplot 4.6 patchlevel 4 -%%CreationDate: Fri Sep 30 10:14:40 2016 +%%CreationDate: Sat Nov 19 10:17:43 2016 %%DocumentFonts: %%BoundingBox: 50 50 373 237 %%EndComments @@ -430,10 +430,10 @@ SDict begin [ /Title (pointprocessscetchB.tex) /Subject (gnuplot plot) /Creator (gnuplot 4.6 patchlevel 4) - /Author (grewe) + /Author (jan) % /Producer (gnuplot) % /Keywords () - /CreationDate (Fri Sep 30 10:14:40 2016) + /CreationDate (Sat Nov 19 10:17:43 2016) /DOCINFO pdfmark end } ifelse diff --git a/pointprocesses/lecture/pointprocessscetchB.pdf b/pointprocesses/lecture/pointprocessscetchB.pdf index 8a506c9..6e4e783 100644 Binary files a/pointprocesses/lecture/pointprocessscetchB.pdf and b/pointprocesses/lecture/pointprocessscetchB.pdf differ diff --git a/programming/code/boltzmann.m b/programming/code/boltzmann.m new file mode 100644 index 0000000..f46d0fb --- /dev/null +++ b/programming/code/boltzmann.m @@ -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 + diff --git a/programming/code/plotboltzmann.m b/programming/code/plotboltzmann.m new file mode 100644 index 0000000..5fb919c --- /dev/null +++ b/programming/code/plotboltzmann.m @@ -0,0 +1,3 @@ +p = boltzmann(voltage, a); +plot(voltage, p) +y = -1; diff --git a/programming/exercises/boolean_logical_indexing.tex b/programming/exercises/boolean_logical_indexing.tex index 42276b2..9f0d3e5 100644 --- a/programming/exercises/boolean_logical_indexing.tex +++ b/programming/exercises/boolean_logical_indexing.tex @@ -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} \ No newline at end of file +\end{document} diff --git a/programming/exercises/control_flow.tex b/programming/exercises/control_flow.tex index f17a192..bfb1cd4 100644 --- a/programming/exercises/control_flow.tex +++ b/programming/exercises/control_flow.tex @@ -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: diff --git a/programming/exercises/factorialscripta.m b/programming/exercises/factorialscripta.m new file mode 100644 index 0000000..38fedde --- /dev/null +++ b/programming/exercises/factorialscripta.m @@ -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) diff --git a/programming/exercises/factorialscriptb.m b/programming/exercises/factorialscriptb.m new file mode 100644 index 0000000..8488431 --- /dev/null +++ b/programming/exercises/factorialscriptb.m @@ -0,0 +1 @@ +printfaculty(5); diff --git a/programming/exercises/factorialscriptc.m b/programming/exercises/factorialscriptc.m new file mode 100644 index 0000000..164ab7b --- /dev/null +++ b/programming/exercises/factorialscriptc.m @@ -0,0 +1,3 @@ +n = 5 +a = myfactorial(n); +fprintf('Factorial of %i is: %i\n', n, x) diff --git a/programming/exercises/myfactorial.m b/programming/exercises/myfactorial.m new file mode 100644 index 0000000..2c5668c --- /dev/null +++ b/programming/exercises/myfactorial.m @@ -0,0 +1,7 @@ +function x = mufactorial(n) +% return the factorial of n +x = 1; +for i = 1:n + x = x * i; +end +end diff --git a/programming/exercises/plotsine.m b/programming/exercises/plotsine.m new file mode 100644 index 0000000..8828b17 --- /dev/null +++ b/programming/exercises/plotsine.m @@ -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 diff --git a/programming/exercises/plotsine50.m b/programming/exercises/plotsine50.m new file mode 100644 index 0000000..19e74ae --- /dev/null +++ b/programming/exercises/plotsine50.m @@ -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 diff --git a/programming/exercises/plotsinea.m b/programming/exercises/plotsinea.m new file mode 100644 index 0000000..0c64eea --- /dev/null +++ b/programming/exercises/plotsinea.m @@ -0,0 +1 @@ +plotsine50() diff --git a/programming/exercises/plotsineb.m b/programming/exercises/plotsineb.m new file mode 100644 index 0000000..48690d4 --- /dev/null +++ b/programming/exercises/plotsineb.m @@ -0,0 +1 @@ +plotsine(5.0, 2.0, 1.5) diff --git a/programming/exercises/plotsinec.m b/programming/exercises/plotsinec.m new file mode 100644 index 0000000..2b077a7 --- /dev/null +++ b/programming/exercises/plotsinec.m @@ -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)); diff --git a/programming/exercises/plotsined.m b/programming/exercises/plotsined.m new file mode 100644 index 0000000..42cf19d --- /dev/null +++ b/programming/exercises/plotsined.m @@ -0,0 +1,4 @@ +freq = 5.0; +ampl = 2.0; +[time, sine] = sinewave(freq, ampl, 1.5); +plotsinewave(time, sine); diff --git a/programming/exercises/plotsinewave.m b/programming/exercises/plotsinewave.m new file mode 100644 index 0000000..f2960da --- /dev/null +++ b/programming/exercises/plotsinewave.m @@ -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'); diff --git a/programming/exercises/printfactorial.m b/programming/exercises/printfactorial.m new file mode 100644 index 0000000..5df0c28 --- /dev/null +++ b/programming/exercises/printfactorial.m @@ -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 diff --git a/programming/exercises/randomwalk.m b/programming/exercises/randomwalk.m new file mode 100644 index 0000000..5bde73d --- /dev/null +++ b/programming/exercises/randomwalk.m @@ -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 diff --git a/programming/exercises/randomwalkscript.m b/programming/exercises/randomwalkscript.m new file mode 100644 index 0000000..15cff7c --- /dev/null +++ b/programming/exercises/randomwalkscript.m @@ -0,0 +1,7 @@ +n = 2000; +hold on +for k = 1:10 + [t, x] = randomwalk(n); + plot(t, x) +end +hold off diff --git a/programming/exercises/randomwalkscriptb.m b/programming/exercises/randomwalkscriptb.m new file mode 100644 index 0000000..21a0656 --- /dev/null +++ b/programming/exercises/randomwalkscriptb.m @@ -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 diff --git a/programming/exercises/randomwalkscriptc.m b/programming/exercises/randomwalkscriptc.m new file mode 100644 index 0000000..1aef316 --- /dev/null +++ b/programming/exercises/randomwalkscriptc.m @@ -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 diff --git a/programming/exercises/randomwalkscriptd.m b/programming/exercises/randomwalkscriptd.m new file mode 100644 index 0000000..5cb49bc --- /dev/null +++ b/programming/exercises/randomwalkscriptd.m @@ -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'); \ No newline at end of file diff --git a/programming/exercises/randomwalkthresh.m b/programming/exercises/randomwalkthresh.m new file mode 100644 index 0000000..731c425 --- /dev/null +++ b/programming/exercises/randomwalkthresh.m @@ -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 diff --git a/programming/exercises/scripts_functions.tex b/programming/exercises/scripts_functions.tex index 1baf4c5..6ef775b 100644 --- a/programming/exercises/scripts_functions.tex +++ b/programming/exercises/scripts_functions.tex @@ -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 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 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 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} \ No newline at end of file +\end{document} diff --git a/programming/exercises/sinewave.m b/programming/exercises/sinewave.m new file mode 100644 index 0000000..5e446b9 --- /dev/null +++ b/programming/exercises/sinewave.m @@ -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 diff --git a/scientificcomputing-script.tex b/scientificcomputing-script.tex index 61df5a6..b8533c8 100644 --- a/scientificcomputing-script.tex +++ b/scientificcomputing-script.tex @@ -2,7 +2,7 @@ \input{header} -\setcounter{maxexercise}{0} % show listings up to exercise maxexercise +\setcounter{maxexercise}{1000} % show listings up to exercise maxexercise %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/statistics/exercises/Makefile b/statistics/exercises/Makefile index 925485d..27691d9 100644 --- a/statistics/exercises/Makefile +++ b/statistics/exercises/Makefile @@ -1,6 +1,6 @@ -TEXFILES=$(wildcard statistics??.tex) +TEXFILES=$(wildcard exercises??.tex) EXERCISES=$(TEXFILES:.tex=.pdf) -SOLUTIONS=$(EXERCISES:statistics%=solutions%) +SOLUTIONS=$(EXERCISES:exercises%=solutions%) .PHONY: pdf exercises solutions watch watchexercises watchsolutions clean @@ -10,7 +10,7 @@ exercises : $(EXERCISES) solutions : $(SOLUTIONS) -$(SOLUTIONS) : solutions%.pdf : statistics%.tex instructions.tex +$(SOLUTIONS) : solutions%.pdf : exercises%.tex instructions.tex { echo "\\documentclass[answers,12pt,a4paper,pdftex]{exam}"; sed -e '1d' $<; } > $(patsubst %.pdf,%.tex,$@) pdflatex -interaction=scrollmode $(patsubst %.pdf,%.tex,$@) | tee /dev/stderr | fgrep -q "Rerun to get cross-references right" && pdflatex -interaction=scrollmode $(patsubst %.pdf,%.tex,$@) || true rm $(patsubst %.pdf,%,$@).[!p]* diff --git a/statistics/exercises/centrallimit.m b/statistics/exercises/centrallimit.m index 0794335..cfc5f0d 100644 --- a/statistics/exercises/centrallimit.m +++ b/statistics/exercises/centrallimit.m @@ -3,36 +3,36 @@ n = 10000; m = 10; % number of loops %% (b) a single data set of random numbers: -x = rand( n, 1 ); +x = rand(n, 1); %% (c) plot probability density: -%histogram( x, 'Normalization', 'pdf' ); -[h,b] = hist( x, 20 ); +%histogram(x, 'Normalization', 'pdf'); +[h,b] = hist(x, 20); h = h/sum(h)/(b(2)-b(1)); % normalization bar(b, h) title('A uniform distribution') xlabel('x') ylabel('probability density') -pause( 2.0 ) +pause(2.0) %% (d) sum of two random numbers: -y = rand( n, 1 ); +y = rand(n, 1); x = x + y; -%histogram( x, 'Normalization', 'pdf' ); -[h,b] = hist( x, 20 ); +%histogram(x, 'Normalization', 'pdf'); +[h,b] = hist(x, 20); h = h/sum(h)/(b(2)-b(1)); % normalization bar(b, h) title('Sum of two uniform distributions') xlabel('x') ylabel('probability density') -pause( 2.0 ) +pause(2.0) %% (f) sum up more distributions: -x = zeros( n, 1 ); -means = zeros( m, 1 ); -stds = zeros( m, 1 ); +x = zeros(n, 1); +means = zeros(m, 1); +stds = zeros(m, 1); for i=1:m - y = rand( n, 1 ); % new uniform distributed numbers + y = rand(n, 1); % new uniform distributed numbers x = x + y; % add them to the sum mu = mean(x); % compute mean sd = std(x); % compute standard deviation @@ -42,34 +42,34 @@ for i=1:m xx = -1:0.01:i+1; % x-axis values for plot of pdf p = exp(-0.5*(xx-mu).^2/sd^2)/sqrt(2*pi*sd^2); % pdf plot(xx, p, 'r', 'linewidth', 3 ) - ns = sprintf( 'N=%d', i ); - text( 0.1, 0.9, ns, 'units', 'normalized' ) + ns = sprintf('N=%d', i); + text(0.1, 0.9, ns, 'units', 'normalized') hold on - %histogram( x, 20, 'Normalization', 'pdf' ); - [h,b] = hist( x, 20 ); + %histogram(x, 20, 'Normalization', 'pdf'); + [h,b] = hist(x, 20); h = h/sum(h)/(b(2)-b(1)); % normalization bar(b, h) hold off xlim([-0.5, i+0.5]) - xlabel( 'x' ) - ylabel( 'summed pdf' ) - savefigpdf( gcf, sprintf('centrallimit-hist%02d.pdf', i), 6, 5 ); + xlabel('x') + ylabel('summed pdf') + savefigpdf(gcf, sprintf('centrallimit-hist%02d.pdf', i), 6, 5); if i < 6 - pause( 3.0 ) + pause(3.0) end end %% (h) mean and standard deviation in dependence on number of summed up distributions: nx = 1:m; -plot( nx, means, 'b', 'linewidth', 4 ); +plot(nx, means, 'b', 'linewidth', 4); hold on -plot( nx, stds, 'r', 'linewidth', 4 ); +plot(nx, stds, 'r', 'linewidth', 4); xx = 0:0.01:m; sdu = 1.0/sqrt(12); % standarad deviation of the uniform distribution plot( xx, sqrt(xx)*sdu, 'k' ) -legend( 'mean', 'std', 'theory' ) +legend('mean', 'std', 'theory') xlabel('N') hold off -savefigpdf( gcf, 'centrallimit-samples.pdf', 6, 5 ); +savefigpdf(gcf, 'centrallimit-samples.pdf', 6, 5); diff --git a/statistics/exercises/die1.m b/statistics/exercises/die1.m index 32ddad4..3c6b60e 100644 --- a/statistics/exercises/die1.m +++ b/statistics/exercises/die1.m @@ -1,39 +1,40 @@ n = 10000; %% (a) simulate n times rolling a die: -x = rollthedie( n ); +maxeyes = 8; +x = rollthedie(n, maxeyes); -%% (b) probability P(3): -P3 = sum(x == 3)/length(x); -fprintf( 'P(3)=%.3f, expected is %.3f\n', P3, 1/6 ); +%% (b) probability P(5): +P5 = sum(x == 5)/length(x); +fprintf('P(5)=%.3f, expected is %.3f\n', P5, 1/maxeyes); -for i =1:6 +for i =1:maxeyes P = sum(x == i)/length(x); - fprintf( 'P(%d)=%.3f, expected is %.3f\n', i, P, 1/6 ); + fprintf('P(%d)=%.3f, expected is %.3f\n', i, P, 1/maxeyes); end %% (c) P(i) -P = zeros(1, 6); -for i =1:6 +P = zeros(1, maxeyes); +for i =1:maxeyes P(i) = sum(x == i)/length(x); end -subplot( 1, 2, 1 ) -plot( [0 7], [1/6 1/6], 'r', 'linewidth', 3 ) +subplot(1, 2, 1) +plot([0 maxeyes+1], [1/maxeyes 1/maxeyes], 'r', 'linewidth', 3) hold on -bar( P ); +bar(P); hold off -set(gca, 'XTick', 1:6 ); -xlim( [ 0 7 ] ); +set(gca, 'XTick', 1:maxeyes); +xlim([0 maxeyes+1]); xlabel('Eyes'); ylabel('Probability'); %% (d) histogram of x -subplot( 1, 2, 2 ); -diehist( x ); +subplot(1, 2, 2); +diehist(x); %% (e) loaded die % eye 1 to 5 have P=1/8, eye 6 has P = 3/8 ! -x = randi( 8, 1, n ); % random numbers from 1 to 8 -x(x>6) = 6; % set numbers 7 and 8 to 6 -diehist( x ); -savefigpdf(gcf, 'die1.pdf', 12, 5) \ No newline at end of file +x = randi(8, 1, n); % random numbers from 1 to 8 +x(x>6) = 6; % set numbers 7 and 8 to 6 +diehist(x); +savefigpdf(gcf, 'die1.pdf', 12, 5) diff --git a/statistics/exercises/die1.pdf b/statistics/exercises/die1.pdf index bc4ed16..375f3cb 100644 Binary files a/statistics/exercises/die1.pdf and b/statistics/exercises/die1.pdf differ diff --git a/statistics/exercises/die2.m b/statistics/exercises/die2.m index bd2e5f1..caaa411 100644 --- a/statistics/exercises/die2.m +++ b/statistics/exercises/die2.m @@ -3,23 +3,25 @@ n = 100; P = zeros(ndies, 6); for i = 1:ndies % (a) roll a single die: - x = rollthedie( n ); + x = rollthedie(n, 6); % (b) compute normalized histogram: - [h,b] = hist( x, 1:6 ); + [h,b] = hist(x, 1:6); h = h/sum(h); % normalization % (c) store the histograms: P(i,:) = h; end + % (c) mean and standard deviation for each eye: m = mean(P, 1); s = std(P, 1); + % (d) plot results: bar(m, 'facecolor', [0.8 0 0]); % darker red hold on; -errorbar(m, s, '.k', 'linewidth', 2 ); % k is black -set(gca, 'XTick', 1:6 ); -xlim( [ 0, 7 ] ); -ylim( [ 0, 0.25]) +errorbar(m, s, '.k', 'linewidth', 2); % k is black +set(gca, 'XTick', 1:6); +xlim([ 0, 7 ]); +ylim([ 0, 0.25]) xlabel('Eyes'); ylabel('Probability'); hold off; diff --git a/statistics/exercises/diehist.m b/statistics/exercises/diehist.m index 1581884..eff8dfe 100644 --- a/statistics/exercises/diehist.m +++ b/statistics/exercises/diehist.m @@ -1,14 +1,15 @@ -function diehist( x ) -% plots a normalized histogram of random numbers x drawn from rolling a -% die. - [h,b] = hist( x, 1:6 ); - h = h/sum(h); % normalization - plot( [0 7], [1/6 1/6], 'r', 'linewidth', 3 ) - hold on - bar( b, h ); - hold off - set(gca, 'XTick', 1:6 ); - xlim( [ 0, 7 ] ); - xlabel('Eyes'); - ylabel('Probability'); +function diehist(x) +% plots a normalized histogram of integer random numbers x +% drawn from rolling a die. +maxx = max(x); +[h,b] = hist(x, 1:maxx); +h = h/sum(h); % normalization +plot([0 maxx+1], [1/maxx 1/maxx], 'r', 'linewidth', 3) +hold on +bar(b, h); +hold off +set(gca, 'XTick', 1:maxx); +xlim([ 0, maxx+1]); +xlabel('Eyes'); +ylabel('Probability'); end diff --git a/statistics/exercises/exercises01.tex b/statistics/exercises/exercises01.tex new file mode 100644 index 0000000..9610e9d --- /dev/null +++ b/statistics/exercises/exercises01.tex @@ -0,0 +1,224 @@ + \documentclass[12pt,a4paper,pdftex]{exam} + +\usepackage[german]{babel} +\usepackage{pslatex} +\usepackage[mediumspace,mediumqspace,Gray]{SIunits} % \ohm, \micro +\usepackage{xcolor} +\usepackage{graphicx} +\usepackage[breaklinks=true,bookmarks=true,bookmarksopen=true,pdfpagemode=UseNone,pdfstartview=FitH,colorlinks=true,citecolor=blue]{hyperref} + +%%%%% layout %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\usepackage[left=20mm,right=20mm,top=25mm,bottom=25mm]{geometry} +\pagestyle{headandfoot} +\ifprintanswers +\newcommand{\stitle}{: L\"osungen} +\else +\newcommand{\stitle}{} +\fi +\header{{\bfseries\large \"Ubung 6\stitle}}{{\bfseries\large Statistik}}{{\bfseries\large 22. November, 2016}} +\firstpagefooter{Prof. Dr. Jan Benda}{Phone: 29 74573}{Email: +jan.benda@uni-tuebingen.de} +\runningfooter{}{\thepage}{} + +\setlength{\baselineskip}{15pt} +\setlength{\parindent}{0.0cm} +\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 +} + +%%%%% math stuff: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{bm} +\usepackage{dsfont} +\newcommand{\naZ}{\mathds{N}} +\newcommand{\gaZ}{\mathds{Z}} +\newcommand{\raZ}{\mathds{Q}} +\newcommand{\reZ}{\mathds{R}} +\newcommand{\reZp}{\mathds{R^+}} +\newcommand{\reZpN}{\mathds{R^+_0}} +\newcommand{\koZ}{\mathds{C}} + +%%%%% page breaks %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\newcommand{\continue}{\ifprintanswers% +\else +\vfill\hspace*{\fill}$\rightarrow$\newpage% +\fi} +\newcommand{\continuepage}{\ifprintanswers% +\newpage +\else +\vfill\hspace*{\fill}$\rightarrow$\newpage% +\fi} +\newcommand{\newsolutionpage}{\ifprintanswers% +\newpage% +\else +\fi} + +%%%%% new commands %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\newcommand{\qt}[1]{\textbf{#1}\\} +\newcommand{\pref}[1]{(\ref{#1})} +\newcommand{\extra}{--- Zusatzaufgabe ---\ \mbox{}} +\newcommand{\code}[1]{\texttt{#1}} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{document} + +\input{instructions} + +\ifprintanswers% +\else + +\begin{itemize} +\item \"Uberzeuge dich von jeder einzelnen Zeile deines Codes, dass + sie auch wirklich das macht, was sie machen soll! Teste dies mit + kleinen Beispielen direkt in der Kommandozeile. +\item Versuche die L\"osungen der Aufgaben m\"oglichst in + sinnvolle kleine Funktionen herunterzubrechen. + Sobald etwas \"ahnliches mehr als einmal berechnet werden soll, + lohnt es sich eine Funktion daraus zu schreiben! +\item Teste rechenintensive \code{for} Schleifen, Vektoren, Matrizen + zuerst mit einer kleinen Anzahl von Wiederholungen oder kleiner + Gr\"o{\ss}e, und benutze erst am Ende, wenn alles \"uberpr\"uft + ist, eine gro{\ss}e Anzahl von Wiederholungen oder Elementen, um eine gute + Statistik zu bekommen. +\item Benutze die Hilfsfunktion von \code{matlab} (\code{help + command} oder \code{doc command}) und das Internet, um + herauszufinden, wie bestimmte \code{matlab} Funktionen zu verwenden + sind und was f\"ur M\"oglichkeiten sie bieten. + Auch zu inhaltlichen Konzepten bietet das Internet oft viele + Antworten! +\item Die L\"osung bitte als zip-Archiv mit dem Namen + ``probabilities\_\{nachname\}\_\{vorname\}.zip'' auf ILIAS hochladen. +\end{itemize} + +\fi + + +\begin{questions} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\question \textbf{Lies im Skript das Kapitel 3 ``Programmierstil''!} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\question \qt{Wahrscheinlichkeiten eines W\"urfels I} +Der Computer kann mit W\"urfeln w\"urfeln die mehr als 6 Seiten haben! +\begin{parts} + \part Simuliere 10000 W\"urfe mit einem W\"urfel mit acht Seiten + durch Erzeugung von ganzzahligen Zufallszahlen mit den Augenzahlen + $x_i = 1, 2, \ldots 8$ . + + \part Berechne die Wahrscheinlichkeit $P(5)$ des Auftretens der + Augenzahl f\"unf durch Bestimmung der Anzahl der F\"unfen im + Datensatz. + + Entspricht das Ergebnis deiner Erwartung? + + \"Uberpr\"ufe auch die Wahrscheinlichkeit $P(x_i)$ der anderen + Zahlen. + + Ist das ein fairer W\"urfel? + + \part Speicher die berechneten Wahrscheinlichkeiten $P(x_i)$ f\"ur + das Auftreten der gew\"urfelten Zahlen in einem Vektor und benutze + die \code{bar()} Funktion, um diese Wahrscheinlichkeiten als + Funktion der Augenzahl zu plotten. + + \part Erstelle in einem weiterem Plot ein entsprechendes normiertes Histogramm + mit Hilfe der \code{hist()} und \code{bar()} Funktionen. + + \part \extra Wie k\"onnte man einen gezinkten sechsseitigen W\"urfel + simulieren, bei dem die sechs dreimal so h\"aufig wie die anderen + Zahlen gew\"urfelt wird? + + Fertige von diesem W\"urfel ein normiertes Histogram aus 10000 + W\"urfen an. +\end{parts} +\begin{solution} + \lstinputlisting{rollthedie.m} + \lstinputlisting{diehist.m} + \lstinputlisting{die1.m} + \includegraphics[width=1\textwidth]{die1} +\end{solution} + + +\continue +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\question \qt{Wahrscheinlichkeiten eines W\"urfels II} +Wir werten nun das Verhalten mehrerer W\"urfel aus. +\begin{parts} + \part Simuliere 20 W\"urfel, von denen jeder 100 mal geworfen wird + (jeder W\"urfel wird mit dem gleichen Zufallsgenerator simuliert). + \part Berechne aus diesem Datensatz f\"ur jeden W\"urfel ein normiertes Histogramm. + \part Bestimme den Mittelwert und die Standardabweichung f\"ur jede + Augenzahl gemittelt \"uber die W\"urfel. + \part Stelle das Ergebnis in einem S\"aulenplot mit Fehlerbalken dar + (\code{bar()} mit \code{errorbar()} Funktionen). +\end{parts} +\begin{solution} + \lstinputlisting{die2.m} + \includegraphics[width=0.5\textwidth]{die2} +\end{solution} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\question \qt{Histogramm der Normalverteilung} +\vspace{-3ex} +\begin{parts} + \part Erzeuge einen Datensatz $X = (x_1, x_2, ... x_n)$ aus + $n=10000$ normalverteilten Zufallszahlen mit Mittelwert $\mu=0$ und + Standardabweichung $\sigma=1$ (\code{randn()} Funktion). + + \part Berechne aus diesem Datensatz die Wahrscheinlichkeit $P(0\le + x<0.5)$. + + \part Was passiert mit der Wahrscheinlichkeit eine Zahl in einem + bestimmten Interval zu ziehen (z.B. $P(0\le x=0.0 & x<0.5); +P = n/length(x); +fprintf('probability 0<=x<0.5 is %g\n', P); + +%% c) probability for decreasing intervals: +upper = [0.0:0.01:4.0]; +P = zeros(length(upper), 1); +for k=1:length(upper) + P(k) = sum((x>=0) & (x=bins(k)-bw/2) & (x=-1.0)&(x<=1.0)); Psig = nsig/length(x); fprintf('%d of %d data elements, i.e. %.2f%% are contained in the interval -1 to +1\n\n', ... nsig, length(x), 100.0*Psig ); -%% (c) +%% (d) intgegral over pdf: dx = 0.01; xx = -10:dx:10; % x-values pg = exp(-0.5*xx.^2)/sqrt(2*pi); % y-values Gaussian pdf @@ -17,30 +33,25 @@ P = sum(pg)*dx; fprintf( 'Integral over the Gaussian pdf is %.3f\n', P ); % integral from -1 to 1: P = sum(pg((xx>=-1.0)&(xx<=1.0)))*dx; % we need to use xx, not the random numbers x! -fprintf( 'Integral over the Gaussian pdf from -1 to 1 is %.4f\n', P ); +fprintf( 'Integral over the Gaussian pdf from -1 to 1 is %.4f\n\n', P ); -%% (d) -P = sum(pg((xx>=-2.0)&(xx<=2.0)))*dx; -fprintf( 'Integral over the Gaussian pdf from -2 to 2 is %.4f\n', P ); -P = sum(pg((xx>=-3.0)&(xx<=3.0)))*dx; -fprintf( 'Integral over the Gaussian pdf from -3 to 3 is %.4f\n\n', P ); +%% (e) +for sigma = [1.0, 2.0, 3.0] + Pdata = sum((x>=-sigma)&(x<=sigma))/length(x); + Ppdf = sum(pg((xx>=-sigma)&(xx<=sigma)))*dx; + fprintf( 'Integral over the Gaussian pdf from -%.0f to +%.0f is %.4f\n', sigma, sigma, Ppdf ); + fprintf( 'Probability of data in range from -%.0f to +%.0f is %.4f\n\n', sigma, sigma, Pdata ); +end -%% (e) probability of small ranges -nr = 50; -xmax = 3.0 -xs = zeros(nr, 1); % size of integration interval -Ps = zeros(nr, 1); % storage -for i = 1:nr - % upper limit goes from 4.0 down to 0.0: - xupper = xmax*(nr-i)/nr; - xs(i) = xupper; - % integral from 0 to xupper: - Ps(i) = sum(pg((xx>=0.0)&(xx<=xupper)))*dx; +%% (f) +for P = [0.5, 0.9, 0.95, 0.99] + for upper = xx(xx>0.0) + Ppdf = sum(pg((xx>=-upper)&(xx<=upper)))*dx; + if Ppdf > P + fprintf('-%.2f < x < +%.2f: P=%.2f\n', upper, upper, P); + break + end + end end -plot( xs, Ps, 'linewidth', 3 ) -xlim([0 xmax]) -ylim([0 0.55]) -xlabel('Integration interval') -ylabel('Probability') -fprintf('The probability P(0.1234) = %.4f\n\n', sum(x == 0.1234)/length(x) ); -savefigpdf(gcf, 'normprobs.pdf', 12, 8); + + diff --git a/statistics/exercises/normprobs.pdf b/statistics/exercises/normprobs.pdf deleted file mode 100644 index f0e5456..0000000 Binary files a/statistics/exercises/normprobs.pdf and /dev/null differ diff --git a/statistics/exercises/rollthedie.m b/statistics/exercises/rollthedie.m index 1842da8..2e42a04 100644 --- a/statistics/exercises/rollthedie.m +++ b/statistics/exercises/rollthedie.m @@ -1,4 +1,5 @@ -function x = rollthedie( n ) -% return a vector with the result of rolling a die n times - x = randi( [1, 6], n, 1 ); +function x = rollthedie(n, m) +% return a vector with the result of rolling a die +% with m eyes n times +x = randi( [1, m], n, 1 ); end diff --git a/statistics/exercises/statistics01.tex b/statistics/exercises/statistics01.tex deleted file mode 100644 index 767142c..0000000 --- a/statistics/exercises/statistics01.tex +++ /dev/null @@ -1,184 +0,0 @@ -\documentclass[12pt,a4paper,pdftex]{exam} - -\usepackage[german]{babel} -\usepackage{pslatex} -\usepackage[mediumspace,mediumqspace,Gray]{SIunits} % \ohm, \micro -\usepackage{xcolor} -\usepackage{graphicx} -\usepackage[breaklinks=true,bookmarks=true,bookmarksopen=true,pdfpagemode=UseNone,pdfstartview=FitH,colorlinks=true,citecolor=blue]{hyperref} - -%%%%% layout %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\usepackage[left=20mm,right=20mm,top=25mm,bottom=25mm]{geometry} -\pagestyle{headandfoot} -\ifprintanswers -\newcommand{\stitle}{: L\"osungen} -\else -\newcommand{\stitle}{} -\fi -\header{{\bfseries\large \"Ubung 1\stitle}}{{\bfseries\large Statistik}}{{\bfseries\large 19. Oktober, 2015}} -\firstpagefooter{Prof. Dr. Jan Benda}{Phone: 29 74573}{Email: -jan.benda@uni-tuebingen.de} -\runningfooter{}{\thepage}{} - -\setlength{\baselineskip}{15pt} -\setlength{\parindent}{0.0cm} -\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 -} - -%%%%% math stuff: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\usepackage{amsmath} -\usepackage{amssymb} -\usepackage{bm} -\usepackage{dsfont} -\newcommand{\naZ}{\mathds{N}} -\newcommand{\gaZ}{\mathds{Z}} -\newcommand{\raZ}{\mathds{Q}} -\newcommand{\reZ}{\mathds{R}} -\newcommand{\reZp}{\mathds{R^+}} -\newcommand{\reZpN}{\mathds{R^+_0}} -\newcommand{\koZ}{\mathds{C}} - -%%%%% page breaks %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\newcommand{\continue}{\ifprintanswers% -\else -\vfill\hspace*{\fill}$\rightarrow$\newpage% -\fi} -\newcommand{\continuepage}{\ifprintanswers% -\newpage -\else -\vfill\hspace*{\fill}$\rightarrow$\newpage% -\fi} -\newcommand{\newsolutionpage}{\ifprintanswers% -\newpage% -\else -\fi} - -%%%%% new commands %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\newcommand{\qt}[1]{\textbf{#1}\\} -\newcommand{\pref}[1]{(\ref{#1})} -\newcommand{\extra}{--- Zusatzaufgabe ---\ \mbox{}} -\newcommand{\code}[1]{\texttt{#1}} - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{document} - -\input{instructions} - - -\begin{questions} - -\question \qt{Wahrscheinlichkeiten eines W\"urfels I} - -Der Computer kann auch als W\"urfel verwendet werden! -\begin{parts} - \part Simuliere 10000 W\"urfe mit dem W\"urfel durch Erzeugung von - ganzzahligen Zufallszahlen mit den Augenzahlen $x_i = 1, 2, \ldots 6$ . - - \part Berechne die Wahrscheinlichkeit $P(3)$ - des Auftretens der Augenzahl drei durch Bestimmung der Anzahl der Dreien im Datensatz.\\ - Entspricht das Ergebnis deiner Erwartung?\\ - \"Uberpr\"ufe auch die Wahrscheinlichkeit $P(x_i)$ der anderen Zahlen.\\ - Ist das ein fairer W\"urfel? - - \part Speicher die berechneten Wahrscheinlichkeiten $P(x_i)$ f\"ur das Auftreten der - gew\"urfelten Zahlen in einem Vektor und benutze die \code{bar} Funktion, - um diese Wahrscheinlichkeiten als Funktion der Augenzahl zu plotten. - - \part Erstelle in einem weiterem Plot ein entsprechendes normiertes Histogramm - mit der \code{hist} Funktion. - - \part \extra Wie k\"onnte man einen gezinkten W\"urfel simulieren, bei dem die sechs - dreimal so h\"aufig wie die anderen Zahlen gew\"urfelt wird?\\ - Fertige von diesem W\"urfel ein Histogram aus 10000 W\"urfen an. -\end{parts} -\begin{solution} - \lstinputlisting{rollthedie.m} - \lstinputlisting{diehist.m} - \lstinputlisting{die1.m} - \includegraphics[width=1\textwidth]{die1} -\end{solution} - - -\continue -\question \qt{Wahrscheinlichkeiten eines W\"urfels II} -Wir werten nun das Verhalten mehrerer W\"urfel aus. -\begin{parts} - \part Simuliere 20 W\"urfel, von denen jeder 100 mal geworfen wird - (jeder W\"urfel wird mit dem gleichen Zufallsgenerator simuliert). - \part Berechne aus diesem Datensatz f\"ur jeden W\"urfel ein normiertes Histogramm. - \part Bestimme den Mittelwert und die Standardabweichung f\"ur jede - Augenzahl gemittelt \"uber die W\"urfel. - \part Stelle das Ergebnis mit einem S\"aulenplot mit Fehlerbalken dar - (\code{bar} mit \code{errorbar} Funktionen). -\end{parts} -\begin{solution} - \lstinputlisting{die2.m} - \includegraphics[width=0.5\textwidth]{die2} -\end{solution} - - -\question \qt{Wahrscheinlichkeiten der Normalverteilung} -Mit den folgenden Aufgaben wollen wir bestimmen, welcher Anteil eines -normalverteilten Datensatzes in bestimmten Grenzen symmetrisch um den -Mittelwert enthalten ist. -\begin{parts} - \part Erzeuge einen Datensatz $X = (x_1, x_2, ... x_n)$ aus - $n=10000$ normalverteilten Zufallszahlen mit Mittelwert $\mu=0$ und - Standardabweichung $\sigma=1$. - \part \label{onesigma} Wieviele dieser Daten sind maximal eine Standardabweichung vom Mittelwert entfernt?\\ - D.h. wieviele Datenwerte $x_i$ haben den Wert $-\sigma < x_i < +\sigma$?\\ - Wie gro{\ss} ist also die Wahrscheinlichkeit $P_{\pm\sigma}$ einen - Wert in diesem Interval zu erhalten? - \part \label{probintegral} Berechne numerisch diese - Wahrscheinlichkeit aus dem entsprechenden Integral - \[ P_{\pm\sigma}=\int_{x=\mu-\sigma}^{x=\mu+\sigma} p_g(x) \, dx \] - \"uber die Normalverteilung - \[ p_g(x) = - \frac{1}{\sqrt{2\pi\sigma^2}}e^{-\frac{1}{2}\left(\frac{x-\mu}{\sigma}\right)^2} \; . \] - \"Uberpr\"ufe zuerst, ob tats\"achlich - \[ \int_{-\infty}^{+\infty} p_g(x) \, dx = 1 \; . \] - Warum muss das so sein? - \part Welcher Anteil der Daten ist in den Intervallen $\pm2\sigma$ sowie $\pm3\sigma$ - enthalten? - \part \label{givenfraction} Finde heraus in welchem Interval symmetrisch um den Mittelwert - 50\,\%, 90\,\%, 95\,\% bzw. 99\,\% der Daten enhalten sind. - \part Was passiert mit der Wahrscheinlichkeit eine Zahl in einem bestimmten Interval - zu ziehen, wenn dieses Intervall immer kleiner wird?\\ - Schreibe ein Programm, das dies illustriert.\\ - Wie gro{\ss} ist die Wahrscheinlichkeit $P(x_i=0.1234)$? - \part \extra Modifiziere den Code der Teilaufgaben \pref{onesigma} - -- \pref{givenfraction} so, dass er f\"ur Datens\"atze mit - beliebigen Mittelwerten und Standardabweichungen funktioniert.\\ - Teste den Code mit entsprechenden Zufallszahlen.\\ - Wie bekommt man mit \code{randn} Zufallszahlen mit beliebiger - Standardabweichung und Mittelwerten? -\end{parts} -\begin{solution} - \lstinputlisting{normprobs.m} - \includegraphics[width=1\textwidth]{normprobs} -\end{solution} - - -\end{questions} - -\end{document} \ No newline at end of file