Mathc matrices/c24a
Installer et compiler ces fichiers dans votre répertoire de travail.
c04d.c |
---|
/* ------------------------------------ */
/* Save as : c04d.c */
/* ------------------------------------ */
#include "v_a.h"
/* ------------------------------------ */
/* ------------------------------------ */
#define RB R4
#define CB C2
/* ------------------------------------ */
/* ------------------------------------ */
void fun(void)
{
double b[RB*(CB)]={
+0.000000000000, -2.000000000000,
+0.000000000000, -1.666666666667,
+1.000000000000, +0.000000000000,
+0.000000000000, +1.000000000000
};
double x[RB*(C1)]={
-1,
2,
-3,
-3,
};
double **B = ca_A_mR(b,i_mR(RB,CB));
double **BT = i_mR(CB,RB);
double **BTB = i_mR(CB,CB); // BT*B
double **invBTB = i_mR(CB,CB); // inv(BT*B)
double **invBTB_BT = i_mR(CB,RB); // inv(BT*B)*BT
double **B_invBTB_BT = i_mR(RB,RB); // B_inv(BT*B)*BT
double **Id = eye_mR(i_mR(RB,RB));
double **V = i_mR(RB,RB); // V = Id - (B_inv(BT*B)*BT)
double **X = ca_A_mR(x,i_mR(RB,C1));
double **VX = i_mR(RB,C1);
clrscrn();
printf(" B is a basis for the orthogonal complement of A : \n\n"
" Find a transformation matrix for \n"
" a projection onto R%d : \n\n"
" Proj(x) = [Id-(B*inv(BT*B)*BT)] * x \n\n",RB);
printf(" B :");
p_mR(B,S5,P4,C7);
stop();
clrscrn();
printf(" BT :");
p_mR(transpose_mR(B,BT),S5,P4,C7);
printf(" BTB :");
p_mR(mul_mR(BT,B,BTB),S5,P4,C7);
printf(" inv(BT*B) :");
p_mR(inv_mR(BTB,invBTB),S5,P4,C7);
printf(" inv(BT*B)*BT :");
p_mR(mul_mR(invBTB,BT,invBTB_BT),S5,P4,C7);
printf(" B*inv(BT*B)*BT :");
p_mR(mul_mR(B,invBTB_BT,B_invBTB_BT),S5,P4,C7);
printf(" V = Id - (B*inv(BT*B)*BT) :");
p_mR(sub_mR(Id,B_invBTB_BT,V),S5,P4,C7);
stop();
clrscrn();
printf(" V is transformation matrix for \n"
" a projection onto a subspace R%d :\n\n",RB);
p_mR(V,S5,P4,C7);
printf(" Proj(x) = [Id-(B*inv(BT*B)*BT)] * x \n\n");
printf(" Proj(x) = V * x :");
p_mR(mul_mR(V,X,VX),S5,P4,C7);
stop();
f_mR(B);
f_mR(BT);
f_mR(BTB); // BT*B
f_mR(invBTB); // inv(BT*B)
f_mR(invBTB_BT); // inv(BT*B)*BT
f_mR(V); // B*inv(BT*B)*BT
f_mR(X);
f_mR(VX);
}
/* ------------------------------------ */
int main(void)
{
fun();
return 0;
}
/* ------------------------------------ */
/* ------------------------------------ */
Trouver une projection sur un sous-espace vectoriel par une application linéaire :
- B est une base pour le complément orthogonal de A. Trouver une matrice V qui projette un vecteur x sur R4.
Proj(x) = V * x V = Id - (B * inv(BT*B) * BT) .
Exemple de sortie écran :
------------------------------------
B is a basis for the orthogonal complement of A :
Find a transformation matrix for
a projection onto R4 :
Proj(x) = [Id-(B*inv(BT*B)*BT)] * x
B :
+0.0000 -2.0000
+0.0000 -1.6667
+1.0000 +0.0000
+0.0000 +1.0000
Press return to continue.
------------------------------------
BT :
+0.0000 +0.0000 +1.0000 +0.0000
-2.0000 -1.6667 +0.0000 +1.0000
BTB :
+1.0000 +0.0000
+0.0000 +7.7778
inv(BT*B) :
+1.0000 -0.0000
-0.0000 +0.1286
inv(BT*B)*BT :
+0.0000 +0.0000 +1.0000 +0.0000
-0.2571 -0.2143 +0.0000 +0.1286
B*inv(BT*B)*BT :
+0.5143 +0.4286 +0.0000 -0.2571
+0.4286 +0.3571 +0.0000 -0.2143
+0.0000 +0.0000 +1.0000 +0.0000
-0.2571 -0.2143 +0.0000 +0.1286
V = Id - (B*inv(BT*B)*BT) :
+0.4857 -0.4286 +0.0000 +0.2571
-0.4286 +0.6429 +0.0000 +0.2143
+0.0000 +0.0000 +0.0000 +0.0000
+0.2571 +0.2143 +0.0000 +0.8714
Press return to continue.
------------------------------------
V is transformation matrix for
a projection onto a subspace R4 :
+0.4857 -0.4286 +0.0000 +0.2571
-0.4286 +0.6429 +0.0000 +0.2143
+0.0000 +0.0000 +0.0000 +0.0000
+0.2571 +0.2143 +0.0000 +0.8714
Proj(x) = [Id-(B*inv(BT*B)*BT)] * x
Proj(x) = V * x :
-2.1143
+1.0714
+0.0000
-2.4429
Press return to continue.