//Ce script manipule la fonction "mc" de l'exercice 4,
//puis teste les améliorations mc_qr et mc_svd classiques

disp('Étude des normes de AX-B quand A et B sont aléatoires :')
exec mc.sci;
A=rand(3,2);    //A aléatoire
B=rand(3,1);    //B aléatoire
X=mc(A,B);        //X qui minimise la norme du résidu
printf(' \n La fonction mc donne X avec AX-B de norme  %f\n',norm(A*X-B))
M=max(abs(X));    //M : plus grande valeur absolue des coordonnées de X
T=M*(2*rand(2,1000)-1);    //1000 vecteurs avec coordonnées entre -2M et 2M
for k=1:1000, N(k)=norm(A*T(:,k)-B); end
printf('et la norme minimale dans l''échantillon est %f\n\n',min(N))

disp('Amélioration quand A est mal conditionnée :')
exec mc_qr.sci;
exec mc_svd.sci;
printf('\n Ici A est la matrice de Hilbert d''ordre 20 augmentée\n..
d''une ligne formée de 1. Son calcul comme inverse de\n..
testmatrix(''hilb'',20) provoque un message d''erreur.\n')
A=[inv(testmatrix('hilb',20));ones(1,20)];
B=rand(21,1);
printf(' Le calcul de l''inverse de R(1:r,:) dans mc est aussi délicat.\n')
X=mc(A,B);
Xqr=mc_qr(A,B);
Xsvd=mc_svd(A,B);
printf(' On obtient les normes de AX-B suivantes :\n..
mc donne la norme  %f\n..
mc_qr la norme     %f\n..
et mc_svd la norme %f\n'..
,norm(A*X-B),norm(A*Xqr-B),norm(A*Xsvd-B))