Primero necesitamos una base del subespacio vectorial. Procedemos a obtener los vectores de la base haciendo las sustituciones habituales:

(%i5) m : matrix([ 3 * a + 2 * b, - 2 * a - b + c],[ b + 2 * c, a - c]) $
s1 : ev( m, a = 1, b = 0, c = 0) $
s2 : ev( m, a = 0, b = 1, c = 0) $
s3 : ev( m, a = 0, b = 0, c = 1) $
print( "S", "=", "Gen", "{", s1, ",", s2, ",", s3, "}") $
S = Gen { [ 3 2 0 1 ] , [ 2 1 1 0 ] , [ 0 1 2 1 ] }

Verifiquemos que constituyen una base:

(%i7) Isom( m) : = create_list( m[ i, j], i, 1, 2, j, 1, 2) $
rank( matrix( Isom( s1), Isom( s2), Isom( s3))) ;
(%o7) 3

Hasta ahora hemos ortogonalizado la base; sin embargo, resulta más sencillo obtener el subespacio ortogonal primero, y de él sacar la proyección. Recordemos \[\textbf{proy}_S(\vec{v})+\textbf{proy}_{S^\bot}(\vec{v})=\vec{v},\]
luego \[\textbf{proy}_S(\vec{v})=\vec{v}-\textbf{proy}_{S^\bot}(\vec{v})\]

(%i10) eq : determinant( matrix([ a, b, c, d], Isom( s1), Isom( s2), Isom( s3))) $
X : matrix([ a, b],[ c, d]) $
print( "S=", "{", X, ";", eq = 0, "}") $
S= { [ a b c d ] ; d + c b a = 0 }

Por tanto,

(%i13) So_u1 : makelist( coeff( eq, Isom( X)[ i]), i, 1, 4) $
So_u1 : matrix( makelist( So_u1[ i], i, 1, 2), makelist( So_u1[ i], i, 3, 4)) $
print( "S^⟂", "=Gen", "{", So_u1, "}") $
S =Gen { [ 1 1 1 1 ] }

Así pues, la proyeccion sobre el ortogonal es:

(%i15) v : matrix([ - 1, 0],[ 2, 1]) $
p_So :( mat_trace( transpose( v). So_u1) / mat_trace( transpose( So_u1). So_u1)) * So_u1 ;
0 errores, 0 advertencias (p_So) [ 1 1 1 1 ]

Ahora solo tenemos que restar:

(%i16) p_S : v - p_So ;
(p_S) [ 0 1 1 0 ]

Por último, calculamos la norma del producto:

(%i18) p : p_S. p_So ;
sqrt( mat_trace( transpose( p). p)) ;
(p) [ 1 1 1 1 ] (%o18) 2

Created with wxMaxima.