L'applicazione lineare dallo spazio vettoriale \(V\) (dominio) allo spazio vettoriale \(W\) (codominio) deve soddisfare:
riassumbili nella condizione di linearità:
\(F(\lambda_1{\textbf v}_1) + F(\lambda_2{\textbf v}_2) = \lambda_1F({\textbf v}_1) + \lambda_2F({\textbf v}_2)\)
è condizione necesaria che: \(F(0_V) = F(0_W)\).
Se dominio e codominio corrispondono l'applicazione è un endomorfismo.
Un modo veloce per capire se un'applicazione è lineare è verificare che tutti i componenti del vettore della funzione non abbiano termini noti non nulli e non abbiano polinomi di grado > 1.
Non è applicabile sulle applicazioni lineari definite da immagini di vettori. Per quello vedere sezione "Applicazioni lineare definite da immagini di vettori".
def isApplicazioneLineare(applicazione, param):
"""
Non è applicabile sulle applicazioni lineari definite da immagini di vettori.
"""
scalari = dict()
incognite = dict()
size = len(param)
for i in range(size):
scalari["l" + str(i)] = sp.symbols("l" + str(i))
for j in range(size):
incognite[str(param[i])+str(j)] = sp.symbols(str(param[i])+str(j))
"""first member"""
first_member_expr = sp.zeros(1, size)
for i in range(size):
expr = 0
for j in range(size):
expr += scalari["l" + str(j)]*incognite[str(param[i])+str(j)]
first_member_expr[0, i] = applicazione[i].subs(param[i], expr)
second_member_expr = sp.zeros(1, size)
for i in range(size):
v = sp.zeros(1, size)
for j in range(size):
v[0, j] = applicazione[j].subs(param[j], scalari["l"+str(i)]*incognite[str(param[j])+str(i)])
second_member_expr += v
return first_member_expr == second_member_expr
x,y,z = sp.symbols("x y z")
applicazione = [4*x]
print(isApplicazioneLineare(applicazione, [x]))
True
x,y,z = sp.symbols("x y z")
applicazione = [2*x+y, 3*y, z+5]
print(isApplicazioneLineare(applicazione, [x,y,z]))
False
x,y,z = sp.symbols("x y z")
applicazione = [x, 3*y]
print(isApplicazioneLineare(applicazione, [x,y]))
True
applicazione = [x**2 + y, 0*y]
print(isApplicazioneLineare(applicazione, [x, y]))
False