Apprendre Maple Index du Forum Apprendre Maple
Site dédié au logiciel de calcul formel Maple
 
  Page d'accueilPage d'accueil   FAQFAQ    RechercherRechercher    Liste des MembresListe des Membres    Groupes d'utilisateursGroupes d'utilisateurs 
S'enregistrerS'enregistrer    ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 

Calcul de valeurs propres sur de grosses matrices

 
Poster un nouveau sujet   Répondre au sujet    Apprendre Maple Index du Forum -> Maple en algèbre linéaire
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
bendesarts



Inscrit le: 27 Fév 2009
Messages: 234

MessagePosté le: 21 Mai 2013 23:37    Sujet du message: Calcul de valeurs propres sur de grosses matrices Répondre en citant

Bonjour,

Sur un système mécanique que j'ai pu mettre sous la forme classique Mdiff(x,t,2)+Kx(t)=0, j'aimerais calculer les pulsations propres.
Les méthodes que je connais sont les suivantes :
- calculer les solutions de l'équation det(K-omega^2*M)=0
- ou calculer les solutions de l'équation det(M-1K-omega^2*I)=0
- ou encore déterminer directement les valeurs propres de M-1K à l'aide de fonctions déjà crées dans Maple par exemple.

Mon problème est qu'avec c'est trois différentes méthodes, j'obtiens des résultats différents.
Les résultats des 2 premières méthodes semblent proches mais quand meme très éloigné de la troisième méthode (bien sur en faisant attention au fait que la pulsation propre est la racine carré de la valeur propre).

Est-ce que vous auriez une explication ? et quelle méthode me permet d'avoir les pulsations propres de mon système ?
J'ai entendu parler de problème "raide" c'est-à-dire de problème où les valeurs importantes des raideurs du système peuvent générer des problèmes numériques. C'est peut-être le cas avec matrice K.



Code:
restart;
with(LinearAlgebra):
with(linalg):
Digits := 5;
M := simplify(Matrix(8, 8, {(1, 1) = 4.283, (1, 2) = 0, (1, 3) = 0, (1, 4) = 0, (1, 5) = 0, (1, 6) = 0, (1, 7) = 0, (1, 8) = 0, (2, 1) = 0, (2, 2) = 4.283, (2, 3) = 0, (2, 4) = 0, (2, 5) = 0, (2, 6) = 0, (2, 7) = 0, (2, 8) = 0, (3, 1) = 0, (3, 2) = 0, (3, 3) = .127, (3, 4) = 0, (3, 5) = 0, (3, 6) = 0, (3, 7) = 0, (3, 8) = 0, (4, 1) = 0, (4, 2) = 0, (4, 3) = 0, (4, 4) = 5, (4, 5) = 0, (4, 6) = 0, (4, 7) = 0, (4, 8) = 0, (5, 1) = 0, (5, 2) = 0, (5, 3) = 0, (5, 4) = 0, (5, 5) = 5, (5, 6) = 0, (5, 7) = 0, (5, 8) = 0, (6, 1) = 0, (6, 2) = 0, (6, 3) = 0, (6, 4) = 0, (6, 5) = 0, (6, 6) = .1, (6, 7) = 0, (6, 8) = 0, (7, 1) = 0, (7, 2) = 0, (7, 3) = 0, (7, 4) = 0, (7, 5) = 0, (7, 6) = 0, (7, 7) = 122.3500000, (7, 8) = 0, (8, 1) = 0, (8, 2) = 0, (8, 3) = 0, (8, 4) = 0, (8, 5) = 0, (8, 6) = 0, (8, 7) = 0, (8, 8) = 122.3500000}));
K := simplify(MatrixMatrixMultiply(Matrix(8, 8, {(1, 1) = 20000000000, (1, 2) = 0, (1, 3) = 0., (1, 4) = -10000000000, (1, 5) = 0, (1, 6) = 1915111108., (1, 7) = 0, (1, 8) = 0, (2, 1) = 0, (2, 2) = 20000000000, (2, 3) = 0., (2, 4) = 0, (2, 5) = -10000000000, (2, 6) = 1606969024., (2, 7) = 0, (2, 8) = 0, (3, 1) = 0., (3, 2) = 0., (3, 3) = 15131785.65, (3, 4) = -269145266.0, (3, 5) = -56443119.65, (3, 6) = 60614543.37, (3, 7) = 0, (3, 8) = 0, (4, 1) = -10000000000, (4, 2) = 0, (4, 3) = -269145266.0, (4, 4) = 20000000000, (4, 5) = 0, (4, 6) = 0., (4, 7) = -10000000000, (4, 8) = 0, (5, 1) = 0, (5, 2) = -10000000000, (5, 3) = -56443119.65, (5, 4) = 0, (5, 5) = 20000000000, (5, 6) = 0., (5, 7) = 0, (5, 8) = -10000000000, (6, 1) = 1915111108., (6, 2) = 1606969024., (6, 3) = 60614543.35, (6, 4) = 0., (6, 5) = 0., (6, 6) = 1249999606., (6, 7) = -1915111108., (6, 8) = -1606969024., (7, 1) = 0, (7, 2) = 0, (7, 3) = 0, (7, 4) = -10000000000, (7, 5) = 0, (7, 6) = -1915111108., (7, 7) = 10000000000, (7, 8) = 0, (8, 1) = 0, (8, 2) = 0, (8, 3) = 0, (8, 4) = 0, (8, 5) = -10000000000, (8, 6) = -1606969024., (8, 7) = 0, (8, 8) = 10000000000}),IdentityMatrix(8)));
DD := simplify(MatrixMatrixMultiply(MatrixInverse(M),K));
solve(Determinant(K+lambda^2*M)=0,lambda);
solve(Determinant(DD-omega^2*IdentityMatrix(8))=0,omega);
simplify(Eigenvalues(DD));
simplify(map(x->sqrt(x),%));


Merci d'avance pour votre aide
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
ALS



Inscrit le: 11 Sep 2006
Messages: 647

MessagePosté le: 22 Mai 2013 8:13    Sujet du message: Répondre en citant

Bonjour,

Je pense que la valeur de Digits choisie est trop faible, ce qui a pour incidence des cumuls d'erreurs d'arrondis. Prenez au moins 10.

Vous avez écrit:
solve(Determinant(K+lambda^2*M)=0,lambda);
ce serait plutôt solve(Determinant(K-lambda^2*M)=0,lambda); non?

La méthode utilisant les déterminants 8*8 m'apparait peu fiable au niveau des résultats. Préférez la fonction Eigenvalues.

La méthode de la puissance itérée qui permet de calculer la plus grande valeur propre de DD me donne 1.41695085218764914989124108370*10^10. En plus j'affiche un vecteur propre associé)
ce qui correspond à votre troisième méthode.

Code:

> DD:=convert(DD,matrix):

> puiss := proc (A::linalg:-matrix, epsilon::numeric)
local n, q, x, lambda, r, i;
n := linalg:-rowdim(A);
q := linalg:-vector([1, `$`(0,n-1)]);
x := linalg:-vector(n); r := 1+epsilon; 
while epsilon < r do
   x := evalf(evalm(`&*`(A,q))); q := evalf(evalm(x/linalg:-norm(x,2)));    lambda := evalf(evalm(`&*`(linalg:-transpose(q),x))); r := evalf(linalg:-norm(evalm(`&*`(A,q)-lambda*q),2)) end do;
[lambda, evalm(q)]
end proc:

> puiss(DD, 10^(-10));
 [1.41695085218764914989124108370*10^10, Vector[row](8, {(1) = 0.493161408434303054605930229613e-1, (2) = 0.413505003745934777403934474793e-1, (3) = 0.355876250630561345868898849378e-1, (4) = -0.968033781792161416412241917433e-2, (5) = -0.799803796401187739267833929800e-2, (6) = .997212119454418687647525587699, (7) = -0.105182595782218870702524461727e-2, (8) = -0.883310415887573958324229996833e-3})]

Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
bendesarts



Inscrit le: 27 Fév 2009
Messages: 234

MessagePosté le: 22 Mai 2013 23:27    Sujet du message: Répondre en citant

Super merci pour ton aide.
Et as-tu une petite idée de pourquoi la méthode avec le déterminant ne donne pas de bons résultats ?
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
ALS



Inscrit le: 11 Sep 2006
Messages: 647

MessagePosté le: 23 Mai 2013 11:44    Sujet du message: Répondre en citant

C'est une intuition, il faudrait peut-être poser la question sur mapleprimes.com.
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Apprendre Maple Index du Forum -> Maple en algèbre linéaire Toutes les heures sont au format GMT + 2 Heures
Page 1 sur 1

 
Sauter vers:  
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


phpBB

Développé par phpBB © 2001, 2006 phpBB Group
Traduction par : phpBB-fr.com


Apprendre Maple - ©  - Alain Le Stang - Navigation optimisée pour une résolution 1024 x 768.