7.1 KiB
7.1 KiB
In [ ]:
'''IMPORTS'''
import os;
import sys;
# NOTE: need this to force jupyter to reload imports:
for key in list(sys.modules.keys()):
if key.startswith('src.'):
del sys.modules[key];
os.chdir(os.path.dirname(_dh[0]));
sys.path.insert(0, os.getcwd());
from src.thirdparty.maths import *;
from src.thirdparty.misc import *;
from src.thirdparty.render import *;
from src.maths.diagrams import *;
np.random.seed(8007253); # zur WiederholbarkeitIn [ ]:
'''BEISPIEL-SIGNAL'''
n = 100;
u = np.zeros((n,), dtype=complex);
u[8] = -0.7
u[58] = 1j * sqrt(2);
display_signal(u, 'Beispiel eines Vektors als Signal dargestellt');In [ ]:
'''SEMINARAUFGABE 10.4 a)'''
n = 3;
t = linspace(0, n-1, n);
i, j = np.meshgrid(t, t);
theta = 2*pi * i * j / n;
# definiere die Matrix F_n + die Vektoren u_nk
F_n = (1/sqrt(n)) * exp(-1j * theta);
u_n = [ (1/sqrt(n)) * exp(1j * theta[:, k]) for k in range(n) ];
print(dedent(
f'''
Matrix:
F_{n} = \n{np.round(F_n, 3)}
'''
));
print('');
# NOTE: Programmiersprachen können nicht exakt berechnen.
# Darum entstehen winzige Fehler, die sich durch Runden entfernen lassen.
print('Matrix-Vektor-Produkte:');
for k in range(n):
result = F_n @ u_n[k];
print(dedent(
f'''
u_{{n {k}}} = {np.round(u_n[k], 3)}
F_n · u_{{n {k}}} = {np.round(result, 3)}
'''
));In [ ]:
'''SEMINARAUFGABE 10.4 d)'''
n = 4;
t = linspace(0, n-1, n);
i, j = np.meshgrid(t, t);
theta = 2*pi * i * j / n;
# definiere die Matrix F_n + die Vektoren u_nk
F_n = (1/sqrt(n)) * exp(-1j * theta);
u_n = [ (1/sqrt(n)) * exp(1j * theta[:, k]) for k in range(n) ];
# Eingabe des Vektors:
F_mal_u = np.asarray([100, -3, 0, -3]); # = F_n @ u
'''
NOTE: Folgende Koeffizienten wurden falsch erraten.
TODO: Wie lauten die richtigen Werte? -> Aufgabe!
'''
c = [10,10,40,50];
# Aufschreibung des Signals »bzgl. der harmonischen Basis«:
# u = c[0]u_n[0] + c[1]u_n[1] + c[2]u_n[2] + c[3]u_n[3]
u_guess = sum([ c[k] * u_n[k] for k in range(n) ]);
# Anzeige der Lösung:
display_signal(u_guess, 'Geschätztes Signal');
# Verifikation von Lösung:
print(dedent(
f'''
%error := ‖u_guess – u‖ / ‖u‖
= ‖F_n · (u_guess – u)‖ / ‖F_n · u‖
... wieso?? [Stichwort: unitär]
= ‖F_n · u_guess – F_n · u‖ / ‖F_n · u‖
= {linalg.norm(F_n @ u_guess - F_mal_u)/linalg.norm(F_mal_u):.2%}
'''
));