Dati due piani \(\alpha\) e \(\beta\) sono:
Mettendo le due forme cartesiane dei piani in un sistema lineare (poichè gli eventuali punti in comune hanno coordinate che soddisfano entrambe le equazioni): \(ax+by+cz+d=0\) (eq. cartesiana di \(\alpha\)) \(a'x+b'y+c'z+d'=0\) (eq. cartesiana di \(\beta\))
Il sistema ammette soluzioni solo se \(rk(A) < rk(A|b)\) (matrice incompleta ass., matrice completa ass.), inoltre ammette \(\infty^2\) soluzioni se e solo se \(rk(A)=rk(A|b)=1\) (poiché è dato da \(n-rk(A|b)\) e sappiamo \(n\) essere pari a 3 per via delle tre incognite). Essendo che il rango delle matrici può essere solo pari ad 1 o 2, il sistema non ammette soluzioni se e sole se \(rk(A) = 1\) e \(rk(A|b) = 2\).
Da quanto sopra si conclude che i piani sono:
\(a=\lambda a';\quad b=\lambda b';\quad c=\lambda c', \quad ma \quad d \ne \lambda d'\)
\(a=\lambda a';\quad b=\lambda b';\quad c=\lambda c';\quad d=\lambda d'\)
Se \(\alpha\) e \(\beta\) sono assegnati in forma cartesiana:
\(\alpha = ax+by+cz+d=0\)
\(\beta = a'x+b'y+c'z+d'=0\)
vale quanto descritto sopra, ossia esistenza dello scalare \(\lambda \ne 0\).
Si effettua il passaggio alla forma cartesiana per poi procedere come sopra (vedi sezione "Dalle equazioni parametriche all'equazione cartesiana").
from typing import List
import sympy as sp
from ipynb.fs.full.piano_equazioni_parametriche_equazione_cartesiana import equazioniParametricheToEquazioneCartesiana
def studioParallelismo(alpha_cartesiana: sp.Expr = None, alpha_parametriche: List[sp.Expr] = None, beta_cartesiana: sp.Expr = None, beta_parametriche: List[sp.Expr] = None) -> str:
if alpha_parametriche is not None:
alpha_cartesiana = equazioniParametricheToEquazioneCartesiana(alpha_parametriche, sp.Symbol("s"), sp.Symbol("t"))
if beta_parametriche is not None:
beta_cartesiana = equazioniParametricheToEquazioneCartesiana(beta_parametriche, sp.Symbol("s"), sp.Symbol("t"))
A, b = sp.linear_eq_to_matrix([alpha_cartesiana, beta_cartesiana], sp.symbols("x y z"))
Ab = sp.Matrix([[A, b]])
rangoA = A.rank()
rangoAb = Ab.rank()
if rangoA < rangoAb:
return "PARALLELI_DISTINTI"
if rangoAb is 1 and rangoA is 1:
return "PARALLELI_COINCIDENTI"
else:
return "NON_PARALLELI"
x,y,z = sp.symbols('x y z')
a1 = 2*x + y - 3*z + 5
b1 = 4*x + 2*y - 6*z + 10
studioParallelismo(alpha_cartesiana=a1, beta_cartesiana=b1)
rangoA 1
rangoAb 1
'PARALLELI_COINCIDENTI'
x,y,z,s,t = sp.symbols('x y z s t')
a2 = [
x - 2*s - t,
y - 3,
z - 1 + s - 5*t
]
b2 = [
x - 2 - t,
y - 1 + s,
z - 2*t + 3*s
]
studioParallelismo(alpha_parametriche=a2, beta_parametriche=b2)
rangoA 2
rangoAb 2
'NON_PARALLELI'
x,y,z,s,t = sp.symbols('x y z s t')
a3 = [
x - 1 - 2*s + t,
y - s,
z + 1 + t
]
b3 = x - 2*y - z + 1
studioParallelismo(alpha_parametriche=a3, beta_cartesiana=b3)
rangoA 1
rangoAb 2
'PARALLELI_DISTINTI'