L'applicazione lineare \(F: V \times W \to \mathbb{K}\) è detta bilineare se è lineare sia in \(V\) che in \(W\). Vale a dire se valgono le seguenti proprietà (con \(\alpha,\beta \in \mathbb{K}\) e \(v,v_1,v_2 \in V\) e \(w, w_1, w_2 \in W\)):
La matrice associata ad \(F\) rispetto alla base \(\beta = \{v_1, v_2, v_n\}\) (\(A_F^{\beta}\)) è formata dalle immagini delle coppie di vettori (\(v_i, v_j\)) tramite \(F\) (con \(i, j\) in \(\{1,2,..,n\}\)
\(A_F^{\beta} = \begin{bmatrix}v_{11}&v_{12}&..&v{1n} \\ v_{21}&v_{22}&..&v_{2n} \\ ..&..&..&.. \\ v_{n1} & v_{n2} & .. & v_{nn} \end{bmatrix}\)
Dati i vettori colonna \(v_{\beta}\) e \(w_{\beta}\) le coordinate rispetto alla base \(\beta\) di due vettori \(v,w \in V\), allora l'immagine mediante \(F\) della coppia (\(v,w\)) si individua tramite la matrice associata:
\(F(v, w) = (v_{\beta})^T A_F^{\beta} w_V\)
Viceversa ad ogni matrice \(A\) si può associare una forma bilineare rispetto a \(\beta\)
\(F(v, w) = x^T A y\)
La matrice \(A'\) associata alla forma bilineare \(F\) rispetto alla base \(\beta'\) è data da:
\(A' = M^T A M\)
(dove \(M\) è la matrice di cambiamento di base \(\beta' \to \beta\) ed \(A\) è la matrice associata rispetto alla base \(\beta\)).
Le matrici \(A\) e \(A'\) (\(A_F^{\beta '}\) e \(A_F^{\beta}\)) sono matrici congruenti.
\(\exists v \in V, v \ne 0_v \quad t.c. \quad \forall w \in W: \quad F(v, w) = 0\)
\(F(v,w) = 0 \quad \iff \quad v = 0_V \quad oppure \quad w = 0_V\)
In soldoni: una forma bilineare è degenere se la determinante della matrice associata (rispetto a qualsiasi base) è 0 (poichè il rango è massimo).
\(F(v,w) = F(w,v)\). Le matrici associate a questa forma bilineare sono simmetriche.
def matriceAssociataDiFormaBilineare(forma_bilineare, definizione, base):
matrice_associata = sp.zeros(base.shape[0], base.shape[1])
tupla1 = forma_bilineare[0]
for i, incognita1 in enumerate(tupla1):
tupla2 = forma_bilineare[1]
for j, incognita2 in enumerate(tupla2):
elemento = prodottoScalareVettori(forma_bilineare, definizione, base.row(i), base.row(j))
matrice_associata[i, j] = elemento
return matrice_associata
x1,x2,y1,y2 = sp.symbols("x1 x2 y1 y2")
forma_bilineare = [(x1, x2), (y1,y2)]
definizione = x1*y1 + 2*x1*y2 - 3*x2*y1 + x2*y2
base = sp.eye(2)
A = matriceAssociataDiFormaBilineare(forma_bilineare, definizione, base)
print(sp.latex(A))
b_2 = sp.Matrix([[1,2], [3,-1]])
A = matriceAssociataDiFormaBilineare(forma_bilineare, definizione, b_2)
print(sp.latex(A))
\(\left[\begin{matrix}1 & 2\\-3 & 1\end{matrix}\right]\) \(\left[\begin{matrix}3 & -19\\16 & 13\end{matrix}\right]\)
Come da esercizio.
_x,a1,b1,c1,a2,b2,c2 = sp.symbols("x a1 b1 c1 a2 b2 c2")
def p(x):
return a1+b1*x+c1*x**2
def q(x):
return a2+b2*x+c2*x**2
def p_der(): return sp.diff(p(_x), _x)
def q_der(): return sp.diff(q(_x), _x)
def p1(x):
return p_der().subs(_x, x)
def q1(x):
return q_der().subs(_x, x)
print(p(0), q(0), p1(0), q1(0))
forma_bilineare = [(a1,b1,c1), (a2,b2,c2)]
definizione = 2*p(0)*q(0) + p1(0)*q(1) + 3*p(1)*q1(0)
base = sp.eye(3)
A = matriceAssociataDiFormaBilineare(forma_bilineare, definizione, base)
print(sp.latex(A))
\(\left[\begin{matrix}2 & 3 & 0\\1 & 4 & 1\\0 & 3 & 0\end{matrix}\right]\)
Come da esercizio.
matrice_associata_beta = sp.Matrix([[1,-1],[0,1]])
beta_1 = sp.Matrix([[1,-1], [0, 2]])
matrice_cambiamento_base_beta_1 = sp.Matrix([[1,0],[-1,2]])
"""Matrice associata beta1 A ′=M T AM"""
matrice_associata_beta_1 = matrice_cambiamento_base_beta_1.T*matrice_associata_beta*matrice_cambiamento_base_beta_1
print(matrice_associata_beta_1)
Matrix([[3, -4], [-2, 4]])
Come da esercizio.
def isFormaBilineareDegenere(forma_bilineare, definizione, base):
matrice_associata = matriceAssociataDiFormaBilineare(forma_bilineare, definizione, base)
print("Matrice associata", matrice_associata)
return int(sp.det(matrice_associata)) is 0
x1,x2,x3,y1,y2,y3 = sp.symbols("x1 x2 x3 y1 y2 y3")
forma_bilineare = [(x1, x2, x3), (y1,y2,y3)]
definizione = x1*(y1+2*y2) + x2*(y2-y3) + x3*(y1-y2+3*y3)
base = sp.eye(3)
print(isFormaBilineareDegenere(forma_bilineare, definizione, base))
Matrice associata Matrix([[1, 2, 0], [0, 1, -1], [1, -1, 3]]) True
Come da esercizio.