def matrix_producten(): # pylint: disable=C0103 RNG().set(4) u = random_tensor(r"\vec u", 3, ret=True, details=False) RNG().consume_entropy(0x02, -0x14, 0x14) M = random_tensor(r"\mathbf{M}", (3,2), ret=True, details=False) N = random_tensor(r"\mathbf{N}", (2,3), ret=True, details=False) O = random_tensor(r"\mathbf{O}", (2,2), ret=True, details=False) display(Markdown("<hr>")) latex_bmatrix(O.dot(N.dot(u)), r"\mathbf{O} (\mathbf{N} \vec u)", details=False) latex_bmatrix(O.dot(N).dot(u), r"(\mathbf{O} \mathbf{N}) \vec u", details=False) latex_bmatrix(O.dot(N), r"\mathbf{O} \mathbf{N}", details=False) display(Markdown("<hr>")) display(Markdown(r"$\mathbf{O}\mathbf{M} = \bot$")) latex_bmatrix(O.dot(O), r"\mathbf{O} \mathbf{O}", details=False) display(Markdown(r"$\mathbf{N}\mathbf{N} = \bot$")) latex_bmatrix(N.dot(M), r"\mathbf{N} \mathbf{M}", details=False) display(Markdown(r"$\mathbf{N}\mathbf{O} = \bot$")) latex_bmatrix(M.dot(N), r"\mathbf{M} \mathbf{N}", details=False) display(Markdown(r"$\mathbf{M}\mathbf{M} = \bot$")) latex_bmatrix(M.dot(O), r"\mathbf{M} \mathbf{O}", details=False)
def inwendige_producten(): RNG().set(3) random_tensor(r"\vec u", 2) random_tensor(r"\vec v", 3) random_tensor(r"\vec w", 2) random_tensor(r"\vec x", 4) random_tensor(r"\vec y", 4)
def determinanten(): RNG().set(6) random_tensor(r"\textbf{M}", (2, 2), singular=NONDEGENERATE) random_tensor(r"\textbf{N}", (2, 2), singular=DEGENERATE) random_tensor(r"\textbf{O}", (2, 2), singular=NONDEGENERATE) random_tensor(r"\textbf{P}", (3, 3), singular=NONDEGENERATE, interval=(0, 5)) random_tensor(r"\textbf{Q}", (3, 3), singular=DEGENERATE, interval=(0, 5))
def inwendige_producten(): # pylint: disable=C0103 RNG().set(3) u = random_tensor(r"\vec u", 2, ret=True, details=False) v = random_tensor(r"\vec v", 3, ret=True, details=False) w = random_tensor(r"\vec w", 2, ret=True, details=False) x = random_tensor(r"\vec x", 4, ret=True, details=False) y = random_tensor(r"\vec y", 4, ret=True, details=False) display(Markdown("<hr>")) dot = lambda u, v: (u.T@v)[0][0] table = f"""$\\begin{{array}}{{|r|c|c|c|c|c|}} \\hline & \\vec u & \\vec v & \\vec w & \\vec x & \\vec y \\\\ \\hline \\vec u & {dot(u,u)} & \\bot & {dot(u,w)} & \\bot & \\bot \\\\ \\hline \\vec v & \\bot & {dot(v,v)} & \\bot & \\bot & \\bot \\\\ \\hline \\vec w & {dot(w,u)} & \\bot & {dot(w,w)} & \\bot & \\bot \\\\ \\hline \\vec x & \\bot & \\bot & \\bot & {dot(x,x)} & {dot(x,y)} \\\\ \\hline \\vec y & \\bot & \\bot & \\bot & {dot(y,x)} & {dot(y,y)} \\\\ \\hline \\end{{array}}$""" display(Markdown(table)) display(Markdown("<hr>")) display(Markdown(r"**Wat valt je op qua symmetrie aan de tabel? Is $\langle \vec u | \vec v\rangle$ hetzelfde als $\langle \vec v | \vec u \rangle$?**")) display(Markdown(r"*Ja, dus de volgorde maakt niet uit / het inwendig product is hier commutatief.*")) display(Markdown(r"**Heeft $\langle \vec u | \vec u \rangle$ een speciale betekenis? Of de wortel daarvan?**")) display(Markdown(r"*De wortel van het inwendig product van een vector met zichzelf is de lengte van de vector (stelling van Pythagoras)*"))
def inverses(): # pylint: disable=C0103 RNG().set(6) def fr_matrix(M, divisor=1, label=None): def fraction(n): n = int(n) gcd = np.gcd(n,divisor) s = '' if divisor*n > 0 else '-' n = abs((n/gcd).round(0).astype(int)) d = abs((divisor/gcd).round(0).astype(int)) if d == 1: return s+str(n) else: return f"{s}\\frac{{{n}}}{{{d}}}" if len(M.shape) > 2: raise ValueError('bmatrix can at most display two dimensions') lines = str(M).replace("[", "").replace("]", "").splitlines() if label: result = [label + " = "] else: result = [""] result += [r"\begin{bmatrix}"] result += [" " + " & ".join(map(fraction, l.split())) + r"\\" for l in lines] result += [r"\end{bmatrix}"] display(Math("\n".join(result))) adj = lambda M: np.array(((M[1][1], -M[0][1]),(-M[1][0], M[0][0]))) M = random_tensor(r"\textbf{M}", (2,2), singular=NONDEGENERATE, ret=True, details=False) det = np.linalg.det(M).round(0).astype(int) latex_bmatrix(adj(M), r"$\text{adj}(\mathbf{M})", details=False) display(Markdown(f"$\\text{{det}}(\\mathbf{{M}}) = {det}$")) fr_matrix(adj(M), det, r"$\mathbf{M}^{-1}") display(Markdown("<hr>")) N = random_tensor(r"\textbf{N}", (2,2), singular=DEGENERATE, ret=True, details=False) latex_bmatrix(adj(N), r"$\text{adj}(\mathbf{N})", details=False) display(Markdown(f"$\\text{{det}}(\\mathbf{{N}}) = {np.linalg.det(N).round(0).astype(int)}$")) display(Markdown(r"$\mathbf{N}^{-1} = \bot$")) display(Markdown("<hr>")) O = random_tensor(r"\textbf{O}", (2,2), singular=NONDEGENERATE, ret=True, details=False) det = np.linalg.det(O).round(0).astype(int) latex_bmatrix(adj(O), r"$\text{adj}(\mathbf{O})", details=False) display(Markdown(f"$\\text{{det}}(\\mathbf{{O}}) = {det}$")) fr_matrix(adj(O), det, r"$\mathbf{O}^{-1}")
def matrix_producten(): RNG().set(4) random_tensor(r"\vec u", 3) RNG().consume_entropy(0x02, -0x14, 0x14) random_tensor(r"\mathbf{M}", (3, 2)) random_tensor(r"\mathbf{N}", (2, 3)) random_tensor(r"\mathbf{O}", (2, 2))
def determinanten(): # pylint: disable=C0103 RNG().set(6) M = random_tensor(r"\textbf{M}", (2,2), singular=NONDEGENERATE, ret=True, details=False) N = random_tensor(r"\textbf{N}", (2,2), singular=DEGENERATE, ret=True, details=False) O = random_tensor(r"\textbf{O}", (2,2), singular=NONDEGENERATE, ret=True, details=False) P = random_tensor(r"\textbf{P}", (3,3), singular=NONDEGENERATE, interval=(0,5), ret=True, details=False) Q = random_tensor(r"\textbf{Q}", (3,3), singular=DEGENERATE, interval=(0,5), ret=True, details=False) display(Markdown("<hr>")) display(Markdown(f"$\\text{{det}}(\\mathbf{{M}}) = {np.linalg.det(M).round(0).astype(int)}$")) display(Markdown(f"$\\text{{det}}(\\mathbf{{N}}) = {np.linalg.det(N).round(0).astype(int)}$")) display(Markdown(f"$\\text{{det}}(\\mathbf{{O}}) = {np.linalg.det(O).round(0).astype(int)}$")) display(Markdown(f"$\\text{{det}}(\\mathbf{{P}}) = {np.linalg.det(P).round(0).astype(int)}$")) display(Markdown(f"$\\text{{det}}(\\mathbf{{Q}}) = {np.linalg.det(Q).round(0).astype(int)}$"))
def matrix_vector(): # pylint: disable=C0103 RNG().set(4) u = random_tensor(r"\vec u", 3, ret=True, details=False) v = random_tensor(r"\vec v", 2, ret=True, details=False) M = random_tensor(r"\mathbf{M}", (3,2), ret=True, details=False) N = random_tensor(r"\mathbf{N}", (2,3), ret=True, details=False) O = random_tensor(r"\mathbf{O}", (2,2), ret=True, details=False) RNG().set(2).consume_entropy(0x06, -0x14, 0x14) pa = random_tensor(r"\vec {p_a}", 2, ret=True, details=False) pb = random_tensor(r"\vec {p_b}", 2, ret=True, details=False) qa = random_tensor(r"\vec {q_a}", 4, ret=True, details=False) qb = random_tensor(r"\vec {q_b}", 4, ret=True, details=False) display(Markdown("<hr>")) latex_bmatrix(M.dot(v), r"\mathbf{M}\vec{v}", details=False) display(Markdown(r"$\mathbf{M}\vec{u} = \bot$")) display(Markdown(r"$\mathbf{N}\vec{v} = \bot$")) latex_bmatrix(N.dot(u), r"\mathbf{N}\vec{u}", details=False) latex_bmatrix(O.dot(N.dot(u)), r"\mathbf{O} (\mathbf{N} \vec u)", details=False) display(Markdown("<hr>")) P = np.hstack((pa,pb)) Q = np.hstack((qa,qb)) latex_bmatrix(P, r"\mathbf{P}", details=False) latex_bmatrix(Q, r"\mathbf{Q}", details=False) display(Markdown("<hr>")) latex_bmatrix(P.dot(np.array((3,4))).reshape(2,1), r"\mathbf{P} \begin{bmatrix}3 \\ 4\end{bmatrix}", details=False) latex_bmatrix(Q.dot(np.array((8,-0.5))).reshape(4,1), r"\mathbf{Q} \begin{bmatrix}8 \\ -\frac{1}{2}\end{bmatrix}", details=False)
def negatieven_en_sommen(): # pylint: disable=C0103 RNG().set(0) u = random_tensor(r"\vec u", ret=True, details=False) v = random_tensor(r"\vec v", ret=True, details=False) w = random_tensor(r"\vec w", 3, ret=True, details=False) x = random_tensor(r"\vec x", 3, ret=True, details=False) y = random_tensor(r"\vec y", 5, ret=True, details=False) z = random_tensor(r"\vec z", 5, ret=True, details=False) display(Markdown("<hr>")) latex_bmatrix(-u, r"-\vec u", details=False) latex_bmatrix(-v, r"-\vec v", details=False) latex_bmatrix(-w + x, r"-\vec w + \vec x", details=False) latex_bmatrix(-y-z, r"- \vec y - \vec z", details=False)
def lineaire_combinaties(): # pylint: disable=C0103 RNG().set(1) u = random_tensor(r"\vec u", ret=True, details=False) v = random_tensor(r"\vec v", ret=True, details=False) w = random_tensor(r"\vec w", 2, ret=True, details=False) x = random_tensor(r"\vec x", 2, ret=True, details=False) y = random_tensor(r"\vec y", 4, ret=True, details=False) z = random_tensor(r"\vec z", 4, ret=True, details=False) display(Markdown("<hr>")) latex_bmatrix(3*u, r"3\vec{u}", details=False) latex_bmatrix(-5*v, r"-5\vec{v}", details=False) latex_bmatrix(v/2, r"\frac{1}{2} \vec{v}", details=False) latex_bmatrix(3*w + 4*x, r"3\vec{w} + 4\vec{x}", details=False) latex_bmatrix(8*y-z/2, r"8\vec{y} - \frac{1}{2}\vec{z}", details=False)
def rank(): # pylint: disable=C0103 RNG().set(7) def stats(M, label): def basis(vs): res = r"\left\{" res += ", ".join([r"\begin{bmatrix}" + r"\\".join([str(c) for c in v]) + r"\end{bmatrix}" for v in vs]) res += r"\right\}" return res U = lu(M)[2] cols = [] for i in range(U.shape[0]): r = np.flatnonzero(U[i, :]) if r.size > 0: cols.append(r[0]) cols = dict.fromkeys(cols) display(Markdown(f"$\\text{{I}}(\\textbf{{{label}}}) = {basis([M[:,c] for c in cols])}$")) display(Markdown(f"$\\text{{Rank}}(\\textbf{{{label}}}) = {np.linalg.matrix_rank(M)}$")) display(Markdown(f"$\\text{{Ker}}(\\textbf{{{label}}}) = {basis(Matrix(M).nullspace())}$")) display(Markdown(f"$\\text{{Nullity}}(\\textbf{{{label}}}) = {M.shape[1] - np.linalg.matrix_rank(M)}$")) M = random_tensor(r"\textbf{M}", (2,2), singular=NONDEGENERATE, interval=(0,5), ret=True, details=False) stats(M, 'M') display(Markdown("<hr>")) N = random_tensor(r"\textbf{N}", (2,2), singular=DEGENERATE, interval=(0,5), ret=True, details=False) stats(N, 'N') display(Markdown("<hr>")) O = random_tensor(r"\textbf{O}", (3,3), singular=NONDEGENERATE, interval=(0,5), ret=True, details=False) stats(O, 'O') display(Markdown("<hr>")) P = random_tensor(r"\textbf{P}", (3,3), singular=DEGENERATE, interval=(0,5), ret=True, details=False) stats(P, 'P') display(Markdown("<hr>")) Q = random_tensor(r"\textbf{Q}", (2,3), singular=DONT_CARE, interval=(0,5), ret=True, details=False) stats(Q, 'Q') display(Markdown("<hr>")) R = random_tensor(r"\textbf{R}", (2,3), singular=DONT_CARE, interval=(0,5), ret=True, details=False) stats(R, 'R') RNG().set(1)
def rank(): RNG().set(7) random_tensor(r"\textbf{M}", (2, 2), singular=NONDEGENERATE, interval=(0, 5)) random_tensor(r"\textbf{N}", (2, 2), singular=DEGENERATE, interval=(0, 5)) random_tensor(r"\textbf{O}", (3, 3), singular=NONDEGENERATE, interval=(0, 5)) random_tensor(r"\textbf{P}", (3, 3), singular=DEGENERATE, interval=(0, 5)) random_tensor(r"\textbf{Q}", (2, 3), singular=DONT_CARE, interval=(0, 5)) random_tensor(r"\textbf{R}", (2, 3), singular=DONT_CARE, interval=(0, 5))
def inverses(): RNG().set(6) random_tensor(r"\textbf{M}", (2, 2), singular=NONDEGENERATE) random_tensor(r"\textbf{N}", (2, 2), singular=DEGENERATE) random_tensor(r"\textbf{O}", (2, 2), singular=NONDEGENERATE)
def matrix_vector(): RNG().set(4) random_tensor(r"\vec u", 3) random_tensor(r"\vec v", 2) random_tensor(r"\mathbf{M}", (3, 2)) random_tensor(r"\mathbf{N}", (2, 3)) random_tensor(r"\mathbf{O}", (2, 2)) RNG().set(2).consume_entropy(0x06, -0x14, 0x14) random_tensor(r"\vec {p_a}", 2) random_tensor(r"\vec {p_b}", 2) random_tensor(r"\vec {q_a}", 4) random_tensor(r"\vec {q_b}", 4)
def lineaire_combinaties(): RNG().set(1) random_tensor(r"\vec u") random_tensor(r"\vec v") RNG().set(2) random_tensor(r"\vec w", 2) random_tensor(r"\vec x", 2) random_tensor(r"\vec y", 4) random_tensor(r"\vec z", 4)
def negatieven_en_sommen(): RNG().set(0) random_tensor(r"\vec u") random_tensor(r"\vec v") random_tensor(r"\vec w", 3) random_tensor(r"\vec x", 3) random_tensor(r"\vec y", 5) random_tensor(r"\vec z", 5)