%Le script aide_TP3 étudie les erreurs et le temps mis pour résoudre un
%système d'équations linéaires par une méthode voisine de celle de Gauss.
help aide_TP3, format short, format compact, echo on
pause

disp(' '), disp('Systèmes linéaires et erreurs d''arrondis :'), disp(' ')
A=[1 2 3 ; 4 5 6 ; 7 8 10]
condA=cond(A)
X0=[1 1 1]'; B=A*X0 %solution X0 de l'équation AX=B
X1=inv(A)*B;
X2=A\B;
norm_res1=norm(A*X1-B), err1=norm(X1-X0) %norme du "résidu" et erreur par inversion de A
norm_res2=norm(A*X2-B), err2=norm(X2-X0) %norme du "résidu" et erreur par Gauss
Abis=A; Abis(3,3)=9
condAbis=cond(Abis), rgAbis=rank(Abis)   %Abis est non inversible !
Base_KerAbis=null(Abis)    %base du noyau de Abis
X3=pinv(Abis)*B;   %résolution (modulo le noyau de Abis) au sens des moindres carrés
X4=Abis\B;         %cf. "help \", puis "help mldivide"
norm_res3=norm(Abis*X3-B), err3=norm(X3-X0) %norme du "résidu" et erreur minimisée
norm_res4=norm(Abis*X4-B), err4=norm(X4-X0) %norme du "résidu" et erreur (par Gauss ?)
pause

disp(' ')
disp('Temps et nombre d''opérations mis pour résoudre un système linéaire en interne :')
disp(' ')
v=[rand(1,10000)+1;1 ./(rand(1,10000)+1)];
tic, for i=1:100, s=sum(v); end; ts=toc/2000000;  %temps pour une addition
tic, for i=1:100, p=prod(v); end; tp=toc/2000000; %temps pour une multiplication
n=200; An=rand(n,n); Bn=rand(n,1);
flops(0), tic, An\Bn; t=toc; nb=flops;            %temps et nb d'opérations pour Gauss
flops(0), tic, inv(An); tbis=toc; nbbis=flops;    %temps et nb d'opérations pour inverser
flops(0), tic, An*An; tter=toc; nbter=flops;    %temps et nb d'opérations pour un carré
echo off
fprintf('Quand n=%3d, Matlab fait environ :\n',n)
fprintf('%.2f x n^3 opérations en %.2f s pour résoudre un systeme linéaire nxn,\n'...
,nb/n^3,t)
fprintf('%.2f x n^3 opérations en %.2f s pour inverser une matrice nxn,\n'...
,nbbis/n^3,tbis)
fprintf('%.2f x n^3 opérations en %.2f s pour calculer le carré d''une matrice nxn,\n'...
,nbter/n^3,tter)
fprintf('et met environ %.2f secondes pour effectuer n^3 opérations itérées.\n\n'...
,((ts+tp)/2)*n^3)
echo on
clear all
pause

disp(' '), disp('Stockage des matrices creuses :'), disp(' ')
C=sprand(10,10,0.2);    %matrice creuse avec environ un terme sur 5 non nul
P=floor(10*full(C))        %full(C) :matrice pleine associée à C (permet "norm(P)")
whos;
spy(C)
[i,j]=find(C);
emplacements_des_termes_non_nuls=[i,j]

clear all
echo off