# Sistema de ecuaciones lineales con un parámetro

 Analizar la existencia de soluciones y, en su caso, calcularlas

Podemos abordar el problema de dos formas:
1. Como un sistema de ecuaciones y el comando   linsolve
2. Como un operador lineal, representable en términos matriciales como A.X=B 
   donde A es la matriz de coeficientes y B la de los términos independientes.

## Primera forma de abordarlo

print("Definimos las ecuaciones y le ponemos un nombre")$
EC:[2*x+y-z=3, x+m*y+z=3,3*x+y-m*z=4]; 

print("Resolvemos el sistema lineal con el comando estándar")$
linsolve(EC,[x,y,z]);

Reflexionando un instante, nos damos cuenta que Maxima ha operado formalmente:
y obtiene una solución única para cada valor del parámetro m,
¿pero qué pasa si m=0? 

## Otra forma de abordarlo

La otra forma es como un operador lineal definido por la "matriz de coeficientes" A
del sistema  EC que podríamos escribir. Pero Maxima puede recuperardo desde  EC

print("Le decimos a Maxima que recupere la matriz usando EC con variables [x,y,z]")$
A: coefmatrix( EC, [x,y,z]);

print("Creamos las matrices X y B")$
X: transpose(matrix([x,y,z]));
B: transpose(matrix([3,3,4]));

print("Resolver A.X=B, o bien A.X-B=0, es lo mismo que antes")$
A.X=B;
A.X-B;
solve(A.X-B,[x,y,z]); 

print("Así no lo resuelve. Es necesario transformarlo en listas
       y llegamos a lo mismo, obviamente")$
solve( list_matrix_entries(A.X-B), [x,y,z]);

### Sacando partido a las técnicas de aplicaciones lineales

Resolver A.X=B  requiere que B esté en la imagen de la aplicación lineal que A
define. Abordemos el estudio del rango de A y, si es posible,  multiplicamos
por A^{-1} a ambos lados.

rank(A);
determinant(A);

Claramente Maxima, opera formalmente, porque para m=0 el rango no es 3.
¿Hay más valores en los que suceda?

solve(determinant(A), m);

La respuesta nos garantiza que salvo para esos valores, que hay que analizar
por separado, la la solución es única para cualquier m y es la obtenida antes.

print("Evaluamos la dimensión del rango para esos valores de m")$
ev( rank(A), m=0);
ev( rank(A), m=2);

Con esa respuesta no podemos garantizar que B esté en la imagen de A.
Triangularizamos la matriz A ampliada con la columna B

addcol(A,B);
T: triangularize(%);

Para m=2 la última fila es de ceros y podemos prescindir de ella

ev( T, m=2);
EC1:  %.transpose(matrix([x,y,z,-1]));

print("Se trata de un sistema compatible, pero indeterminado")$
print("podemos considerar a z como parámetro y calcular x,y")$

solve( list_matrix_entries(EC1), [x,y]);  /* matriz tranformada en lista */;

Finalmente analizamos el caso m=0

M0:  ev( T, m=0);
print("A la vista de la matriz, es incompatible pues 0*x+0*y+0*z =2 es imposible")$

    /* ÚNICAMENTE POR PRACTICAR COMANDOS */ 
submatrix(M0,4);
%.X=submatrix(M0,1,2,3);

### Completamos el estudio de la apliación lineal para m=0

print("m=0",ev(nullspace(A),m=0))$ 
print("m=2",ev(nullspace(A),m=2))$ 
print("proporcionan bases de ker(A) para m=0 y m=2")$ 
print("y las dimensiones de Im(A) son, respectivamente:")$ 
ev(rank(A),m=0); ev(rank(A),m=2);

Para hallar una base del espacio Im(A), basta con hallar la imagen por A 
de los vectores de una base del espacio complemento ortogonal de ker(A).

En el caso de m=0 se trata de encontrar una base en el espacio de los vectores 
[x,y,z] tales que [-1,3,1].[x,y,z]=[0,0,0], 
lo cual, obviamente puede ser abordado como 

nullspace(matrix([-1,3,1]));

print("Hallamos ahora las imágenes por A de dicha base")$
A.matrix([-3],[-1],[0]);
A.matrix([0],[1],[-3]);

## Resumen de la solución del sistema

A) Para m distinto de 0 y 2 el sistema es compatible y determinado 
   la solución es:   x=(3*m-1)/(2*m),  y=3/(2*m),   z=1/(2*m)

B) Para m=0, lo anterior no tiene sentido; de hecho hemos comprobado que
   se trata de un sistema incompatible

C) Para m=2, se tendría, aplicando la solución "general" 
   x=(3*m-1)/(2*m)=5/4,  y=3/(2*m)=3/4,   z=1/(2*m)=1/4
   que cumple x=z+1  y=1-z, y ciertamente es solución... pero hay más 