Exempel 10 Gram Schmidts ortogonalisering
Har man två vektorer som är linjärt oberoende av varandra, kan man enkelt skapa ett ny par där vektorerna är dessutom ortogonala. Vi tar vektorn nummer två och substraherar därifrån 2:ans projektion på ettan:
>
vec1:=vector(3,[1,2,3]);
vec2:=vector(3,[0,1,2]);
dotprod:=evalm(transpose(vec1) &* vec2);
aux:=evalm(transpose(vec1) &* vec1);
För att göra projektionen måste man multiplicera vec1 med inreprodukten mellan 1:an och 2:an och dela med 1:ans belopp:
>
nyvec2:=evalm(vec2-(dotprod/aux) * vec1);
dotprod:=evalm(transpose(vec1) &* nyvec2);
Som sagt. Kommandot GramSchmidt gör detta på en gång:
> nypar:=GramSchmidt({vec1,vec2});
Första elementet är förstås vec1 . Vill man ta ut det andra elementet som en vektor, gör man:
> elem2:=convert(nypar[2],vector);
Det fina med GramSchmidt är att den ortogonaliserar också en bunt linjärt oberoende vektorer på en gång. Gör man det själv "för hand", måste man arbeta med en vektor i taget och hela tiden substrahera projektionen på alla tidigare vektorer. Läs dock i "help": Kommandot svarar även om vektorer inte var linjärt oberoende från början, som i följande exempel:
>
vec3:=evalm(vec1+elem2);
GramSchmidt({vec1,vec2,vec3});