Avendo l'equazione cartesiana del piano
\(ax+by+cz+d=0\)
e le equazioni cartesiane della retta
\(a_1x+b_1y+c_1z+d_1 = 0\)
\(a_2x+b_2y+c_2z+d_2 = 0\)
(nel caso fossero fornite in forma parametrica va fatta la conversione, vedi sezioni relative). Si studia la compatbilità del sistema lineare formato dalle tre equzioni:
\(ax+by+cz+d=0\)
\(a_1x+b_1y+c_1z+d_1 = 0\)
\(a_2x+b_2y+c_2z+d_2 = 0\)
Tramite teorema di Rouché Capelli si può studiare la compatibilità: si pone la matrice incompleta \(A\) e la matrice completa \(A|b\) con la colonna risultati (\(-d_i\)).
Date equazioni (parametriche o cartesiane) di un piano \(\alpha\) e di una retta \(r\), fissare un sist. di rif. cartesiano ortonormale e trovare i coefficienti direttori del piano e i parametri direttori della retta:
Dati:
\(r \perp \alpha \iff rk(\begin{bmatrix}l&m&n\\a&b&c\end{bmatrix}) = 1\)
import sympy as sp
from typing import List
from ipynb.fs.full.piano_equazioni_parametriche_equazione_cartesiana import equazioniParametrichePianoToEquazioneCartesiana
from ipynb.fs.full.retta_equazioni_parametriche_equazioni_cartesiane import equazioniParametricheRettaToEquazioniCartesiane
from ipynb.fs.full.piano_coefficienti_direttori import coefficientiDirettori
from ipynb.fs.full.retta_direzione_nello_spazio import direzioneRetta
from ipynb.fs.full.retta_posizioni_tra_rette import puntoQualsiasiRetta
def posizioneTraRettaEPianoByCoefficientiDirettori(equazione_cartesiana_piano: sp.Expr = None, equazioni_parametriche_piano: sp.Expr = None, equazioni_cartesiane_retta: List[sp.Expr] = None, equazioni_parametriche_retta: List[sp.Expr] = None):
if equazioni_parametriche_piano is not None:
equazione_cartesiana_piano = equazioniParametrichePianoToEquazioneCartesiana(equazioni_parametriche_piano, sp.Symbol("s"), sp.Symbol("t"))
if equazioni_parametriche_retta is not None:
equazioni_cartesiane_retta = equazioniParametricheRettaToEquazioniCartesiane(equazioni_parametriche_retta)
n = coefficientiDirettori(equazione_cartesiana=equazione_cartesiana_piano)
v = direzioneRetta(equazioni_cartesiane=equazioni_cartesiane_retta)
rango_r_alpha = sp.Matrix([
[n[0,0], n[0,1], n[0,2]],
[v[0,0], v[0,1], v[0,2]]
]).rank()
if rango_r_alpha is 1:
return "PERPENDICOLARI"
elif sp.N(n.dot(v)) is 0:
return "COINCIDENTI"
else:
return "PARALLELI"
def posizioneTraRettaEPianoBySistemaLineare(equazione_cartesiana_piano: sp.Expr = None, equazioni_parametriche_piano: sp.Expr = None, equazioni_cartesiane_retta: List[sp.Expr] = None, equazioni_parametriche_retta: List[sp.Expr] = None):
if equazioni_parametriche_piano is not None:
equazione_cartesiana_piano = equazioniParametrichePianoToEquazioneCartesiana(equazioni_parametriche_piano, sp.Symbol("s"), sp.Symbol("t"))
if equazioni_parametriche_retta is not None:
equazioni_cartesiane_retta = equazioniParametricheRettaToEquazioniCartesiane(equazioni_parametriche_retta)
sistema_lineare = [
equazione_cartesiana_piano,
equazioni_cartesiane_retta[0],
equazioni_cartesiane_retta[1]
]
A, b = sp.linear_eq_to_matrix(sistema_lineare, sp.symbols("x y z"))
Ab = sp.Matrix([[A, b]])
rangoA = int(sp.N(A.rank()))
rangoAb = int(sp.N(Ab.rank()))
if rangoA is 3 and rangoA is rangoAb:
result = sp.solve(sistema_lineare)
return sp.Matrix([[
result.get(sp.Symbol("x")),
result.get(sp.Symbol("y")),
result.get(sp.Symbol("z"))
]])
elif rangoA is 2 and rangoA is rangoAb:
return "PARALLELI_INTERNAMENTE"
elif rangoA is not rangoAb:
return "PARALLELI_ESTERNAMENTE"
x,y,z = sp.symbols("x y z")
alpha = x + 5*y - 3*z + 5
r = [
x - y - 1,
2*y - z + 2
]
posizioneTraRettaEPianoByCoefficientiDirettori(equazione_cartesiana_piano=alpha, equazioni_cartesiane_retta=r)
'PARALLELI'
alpha = x + 5*y - 3*z + 5
r = [
x - y - 1,
2*y - z + 2
]
posizioneTraRettaEPianoBySistemaLineare(equazione_cartesiana_piano=alpha, equazioni_cartesiane_retta=r)
'PARALLELI_INTERNAMENTE'