Commit 04799199 authored by Jochen Schulz's avatar Jochen Schulz
Browse files

fix hilbert reference

parent 9fa71126
%% Cell type:markdown id: tags:
# Aufgabe 1
Schreiben Sie eine Funktion, die zu einem gegebenen Vektor dessen Durchschnitt berechnet und zurückgibt.
%% Cell type:code id: tags:
``` python
```
%% Cell type:markdown id: tags:
# Aufgabe 2
Erzeugen Sie eine Hilbert Matrix der Größe $50$. Nutzen sie dafür
``` python
scipy.linalg.hilb
scipy.linalg.hilbert
```
Addieren Sie die Einträge der dritten Spalte!
%% Cell type:code id: tags:
``` python
```
%% Cell type:markdown id: tags:
# Aufgabe 3
Erzeugen Sie die $(100 \times 100)$ - Matrix
$$ \left( \begin{array} {ccccccc}
2 & -1 & & & 0 \\
-1 & 2 & -1 & & \\
& \ddots & \ddots & \ddots &\\
& & -1 & 2 & -1 \\
0 & & & -1 & 2 \\
\end{array} \right) $$
%% Cell type:code id: tags:
``` python
```
%% Cell type:markdown id: tags:
# Aufgabe 4
Schreiben Sie eine Funktion, die zu einem gegebenen Vektor
$x=(x_1, \dots ,x_n)$ die Vandermonde-Matrix
$$ V:= \left(\begin{array}{ccccc}
1 & x_1 & x_1^2 & \dots & x_1^{n-1}\\
1 & x_2 & x_2^2 & \dots & x_2^{n-1}\\
\vdots & \vdots & \vdots & \vdots & \vdots\\
1 & x_n & x_n^2 & \dots & x_n^{n-1}\\
\end{array} \right) $$
berechnet und zurückgibt.
*Hinweis:* ```V = A ** B``` (elementweises potenzieren). mit
$$
A:= \left(\begin{array}{ccccc}
x_1 & x_1 & x_1 & \dots & x_1\\
x_2 & x_2 & x_2 & \dots & x_2\\
\vdots & \vdots & \vdots & \vdots & \vdots\\
x_n & x_n & x_n & \dots & x_n\\ \end{array}
\right) , \quad B:=
\left(\begin{array}{ccccc}
0 & 1 & 2 & \dots & n-1\\
0 & 1 & 2 & \dots & n-1\\
\vdots & \vdots & \vdots & \vdots & \vdots\\
0 & 1 & 2 & \dots & n-1\\
\end{array}
\right)
$$
Hierbei kann Broadcasting genutzt werden.
%% Cell type:code id: tags:
``` python
```
%% Cell type:markdown id: tags:
# Aufgabe 5
(Zufallsgeneratoren, fortgeschritten)
Implementieren Sie die folgenden zwei Generatoren für (pseudo-)zufällige Zahlen:
1. <a title="Multiply-with-carry" href="https://de.wikipedia.org/wiki/Kongruenzgenerator" target="_blank">Linearer Kongruenzgenerator</a> (setzen Sie $a=21$, $b=7$ und $m=100$)
2. <a title="Multiply-with-carry" href="https://de.wikipedia.org/wiki/Multiply-with-carry" target="_blank">Multiply-with-carry</a> (setzen Sie $a=6$ und $b=100$)
Schreiben Sie die Generatoren so, dass Sie den Seed als Argument und die anderen Parameter als optionale Argumente mit obigen Standardwerten akzeptieren. Sie erzeugen dann standardmäßig Zahlen im Intervall $[0, 99]$.
Überprüfen sie die Funktionsfähigkeit ihrer Berechnung bzw. der Qualität der Zufallszahlen durch folgende Schritte:
1. Berechnen sie $N$-Mal 100 Zufallszahlen mit beiden Algorithmen mit jeweils unterschiedlichen Seed (Abhängig von $N < 100$)
2. Bestimmen sie jewils die <a href="https://de.wikipedia.org/wiki/Korrelationskoeffizient">Korrelationskoeffizient</a> für alle Kombinationen der in 1. ausgerechneten Zufallszahlen.
*Hinweis*: Die Periodenlänge der beiden Generatoren sind bei geeigneter Parameterwahl maximal `m` bzw. `a*b - 2`. Üblicherweise werden die Parameter so gewählt, dass die Perioden möglichst lang sind, wodurch auch die generierten Zahlen groß werden. Zahlen in einem kleineren Intervall werden dann durch Reskalierung generiert. Der Einfachheit halber ignorieren wir solche Dinge hier.
%% Cell type:code id: tags:
``` python
```
......
%% Cell type:markdown id: tags:
# Aufgabe 1
Schreiben Sie eine Funktion, die zu einem gegebenen Vektor dessen Durchschnitt berechnet und zurückgibt.
%% Cell type:code id: tags:
``` python
from numpy import array
def meanv(x):
return sum(x)/len(x)
x = array([1, 2, 3, 4])
print (meanv(x))
```
%% Cell type:markdown id: tags:
# Aufgabe 2
Erzeugen Sie eine Hilbert Matrix der Größe $50$. Nutzen sie dafür
``` python
scipy.linalg.hilb
scipy.linalg.hilbert
```
Addieren Sie die Einträge der dritten Spalte!
%% Cell type:code id: tags:
``` python
from scipy.linalg import hilbert
from numpy import ones
A = hilbert(50)
print (A[:,2].T @ ones((len(A[:,2]),)))
# alternativ
print (sum(A[:,2]))
```
%% Cell type:markdown id: tags:
# Aufgabe 3
Erzeugen Sie die $(100 \times 100)$ - Matrix
$$ \left( \begin{array} {ccccccc}
2 & -1 & & & 0 \\
-1 & 2 & -1 & & \\
& \ddots & \ddots & \ddots &\\
& & -1 & 2 & -1 \\
0 & & & -1 & 2 \\
\end{array} \right) $$
%% Cell type:code id: tags:
``` python
from numpy import diag, ones
diag(2*ones((100,)),0) + diag(-1*ones((99,)),-1) + diag(-1*ones((99,)),1)
```
%% Cell type:markdown id: tags:
# Aufgabe 4
Schreiben Sie eine Funktion, die zu einem gegebenen Vektor
$x=(x_1, \dots ,x_n)$ die Vandermonde-Matrix
$$ V:= \left(\begin{array}{ccccc}
1 & x_1 & x_1^2 & \dots & x_1^{n-1}\\
1 & x_2 & x_2^2 & \dots & x_2^{n-1}\\
\vdots & \vdots & \vdots & \vdots & \vdots\\
1 & x_n & x_n^2 & \dots & x_n^{n-1}\\
\end{array} \right) $$
berechnet und zurückgibt.
*Hinweis:* ```V = A ** B``` (elementweises potenzieren). mit
$$
A:= \left(\begin{array}{ccccc}
x_1 & x_1 & x_1 & \dots & x_1\\
x_2 & x_2 & x_2 & \dots & x_2\\
\vdots & \vdots & \vdots & \vdots & \vdots\\
x_n & x_n & x_n & \dots & x_n\\ \end{array}
\right) , \quad B:=
\left(\begin{array}{ccccc}
0 & 1 & 2 & \dots & n-1\\
0 & 1 & 2 & \dots & n-1\\
\vdots & \vdots & \vdots & \vdots & \vdots\\
0 & 1 & 2 & \dots & n-1\\
\end{array}
\right)
$$
Hierbei kann Broadcasting genutzt werden.
%% Cell type:code id: tags:
``` python
from numpy import arange
def vanderv(x):
exponents = arange(len(x))
# Broadcasting: `x` in eine (n x 1)-Matrix umwandeln
# ("Zeilenvektor"), `exponents` ist Vektor mit n Einträgen
# => Ergebnis ist (n x n)-Matrix
return x[:, None] ** exponents
x = array([1, 2, 3, 4])
print(vanderv(x))
```
%% Cell type:markdown id: tags:
# Aufgabe 5
(Zufallsgeneratoren, fortgeschritten)
Implementieren Sie die folgenden zwei Generatoren für (pseudo-)zufällige Zahlen:
1. <a title="Multiply-with-carry" href="https://de.wikipedia.org/wiki/Kongruenzgenerator" target="_blank">Linearer Kongruenzgenerator</a> (setzen Sie $a=21$, $b=7$ und $m=100$)
2. <a title="Multiply-with-carry" href="https://de.wikipedia.org/wiki/Multiply-with-carry" target="_blank">Multiply-with-carry</a> (setzen Sie $a=6$ und $b=100$)
Schreiben Sie die Generatoren so, dass Sie den Seed als Argument und die anderen Parameter als optionale Argumente mit obigen Standardwerten akzeptieren. Sie erzeugen dann standardmäßig Zahlen im Intervall $[0, 99]$.
Überprüfen sie die Funktionsfähigkeit ihrer Berechnung bzw. der Qualität der Zufallszahlen durch folgende Schritte:
1. Berechnen sie $N$-Mal 100 Zufallszahlen mit beiden Algorithmen mit jeweils unterschiedlichen Seed (Abhängig von $N < 100$)
2. Bestimmen sie jewils die <a href="https://de.wikipedia.org/wiki/Korrelationskoeffizient">Korrelationskoeffizient</a> für alle Kombinationen der in 1. ausgerechneten Zufallszahlen.
*Hinweis*: Die Periodenlänge der beiden Generatoren sind bei geeigneter Parameterwahl maximal `m` bzw. `a*b - 2`. Üblicherweise werden die Parameter so gewählt, dass die Perioden möglichst lang sind, wodurch auch die generierten Zahlen groß werden. Zahlen in einem kleineren Intervall werden dann durch Reskalierung generiert. Der Einfachheit halber ignorieren wir solche Dinge hier.
%% Cell type:code id: tags:
``` python
def linearkong(x, a=21, b=7, m=100):
while True:
x = (a*x + b) % m
yield x
def mwc(x, c, a=6, b=100):
while True:
aux = a*x + c
x = aux % b
c = aux // b
yield x
```
%% Cell type:code id: tags:
``` python
from numpy import zeros
def corr(nums):
"""
Calculate the correlation Matrix of the rows of the argument array.
Parameters
----------
nums: 2d array, shape (n*m)
Returns
-------
array: 2d array, shape (n*n)
The element at (i,j) is the correlation coefficient between the
i-th and j-th row of `nums`.
"""
n = nums.shape[0]
covm = zeros((n, n))
for i, xi in enumerate(nums):
for j, xj in enumerate(nums):
covm[i, j] = ((xi-xi.mean()) * (xj-xj.mean())).mean() / (xi.std() * xj.std())
return covm
```
%% Cell type:code id: tags:
``` python
# Alternative Lösung mit Numpy-Operationen / Broadcasting anstelle der for-Schleife.
# Für große Matrizen ist das effizienter, allerdings ist die Implementierung
# etwas unintuitiver.
def corr(nums):
# Mittelwerte und Standardabweichung entlang der Zeilen, reshaped als Spaltenvektor
means = nums.mean(axis=1)[:,None]
stds= nums.std(axis=1)[:,None]
# Zentrieren und normalisieren der Zeilen von `nums` per Broadcasting von Arrays
# mit Shape (n*m) und (n*1)
normalized = (nums - means) / stds
# Berechnen der Korrelationskoeffizienten, also der Mittelwerte aller möglicher
# element-weisen Produkte von Zeilen von `normalized`.
# Dazu wird das (n*m)-Array einmal in ein (n*1*m), einmal in ein (1*n*m)-Array
# umgewandelt und dann multipliziert. Broadcasting liefert ein (n*n*m)-Array, von dem
# entlang der letzten Dimension die Mittelwerte gebildet werden. Das Ergebnis ist dann
# wie gewünscht ein (n*n)-Array.
return (normalized[:,None,:] * normalized[None,:,:]).mean(axis=2)
```
%% Cell type:code id: tags:
``` python
from numpy import array
from itertools import islice
N = 5
nums_lin = array([list(islice(linearkong(n), 100)) for n in range(N)])
nums_mwc = array([list(islice(mwc(n, 30), 100)) for n in range(N)])
```
%% Cell type:code id: tags:
``` python
corr(nums_lin)
```
%% Cell type:code id: tags:
``` python
corr(nums_mwc)
```
%% Cell type:code id: tags:
``` python
```
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment