|
|
|
|
Coucou question ! C'est encore moi ^_^
function determinant = calcul_determinant(M)
determinant=0;
if size(M,1)==1
determinant = M;
else
for p=1:size(M,1)
Mm=M;
Mm(:,1)=[];
Mm(p,:)=[];
determinant = determinant + (-1)^(p+1)*M(p,1)*calcul_determinant(Mm);
end
end
Et tu écris une autre fonction pour l'inverse.
function inverse = calcul_inverse(M)
inverse=zeros(size(M,1));
for p=1:size(M,1)
for q=1:size(M,1)
Mm=M;
Mm(p,:)=[];
Mm(:,q)=[];
inverse(p,q) = (-1)^(p+q)*calcul_determinant(Mm);
end
end
inverse = inverse.'/calcul_determinant(M);
Cela dit, de toutes les méthodes que j'aurais pu te proposer, je pense que c'est la plus lente ! ^_^ Il y a des tas d'algorithmes d'inversion beaucoup plus rapides, ne serait-ce que le pivot de Gauss - en particulier pour les matrices triangulaires - ou le passage par une factorisation LU que tu demandais ici - pourquoi t'appelles-tu un coup question et un coup sahid ? - http://www.commentcamarche.net/forum/affich 6228341 programmation methode de factorisation lu D'ailleurs, c'est très drôle, certains ici ont des passe-droits ici, ils peuvent intervenir dans des sujets qu'ils ne comprennent pas pour insulter les personnes sympathiques comme toi qui viennent demander poliment un programme - pas évident à faire me semble-t-il - et ils ont même des comparses qui viennent colorier leurs messages ! Pour la question que tu posais sur l'autre sujet sahid - ou question -, je ne vais pas pouvoir t'aider, mais tu peux essayer d'adapter cette routine lapack: http://www.netlib.org/lapack/complex16/zgetrf.f Mais dans le fond, c'est un peu bizarre de faire cela puisque Matlab utilise justement les routines lapack. Mais de toute façon, ta demande est bizarre ! ^_^ Je disais donc qu'il existait des méthodes plus rapides, je poursuis, et plus particulièrement pour des matrices spéciales comme les matrices symétriques, hermitiennes, bandes, creuses, etc... Voilà, tu me diras si ça marche. Bonne soirée sahid !
|
Coucou question, c'est encore moi !
function B = calcul_inverse_gauss(A)
n=size(A,1);
B=eye(n);
for p=1:n
vec=[(1:p-1) n (p:n-1)];
test=1;
while A(p,p)==0
if test==n
error('La matrice n''est pas inversible')
end
A=A(vec,:);
B=B(vec,:);
test=test+1;
end
B(p,:)=B(p,:)/A(p,p);
A(p,:)=A(p,:)/A(p,p);
for q=p+1:n
B(q,:)=B(q,:)-A(q,p)*B(p,:);
A(q,:)=A(q,:)-A(q,p)*A(p,:);
end
end
for p=n:-1:2
for q=p-1:-1:1
B(q,:)=B(q,:)-A(q,p)*B(p,:);
A(q,:)=A(q,:)-A(q,p)*A(p,:);
end
end
Voilà ! Tu as plusieurs programmes pour inverser une matrice - programmes totalement inutiles cela dit - ! Bonne journée !
|