 |
Apprendre Maple Site dédié au logiciel de calcul formel Maple
|
Voir le sujet précédent :: Voir le sujet suivant |
Auteur |
Message |
bendesarts
Inscrit le: 27 Fév 2009 Messages: 234
|
Posté le: 21 Mai 2013 23:37 Sujet du message: Calcul de valeurs propres sur de grosses matrices |
|
|
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 |
|
 |
ALS
Inscrit le: 11 Sep 2006 Messages: 647
|
Posté le: 22 Mai 2013 8:13 Sujet du message: |
|
|
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 |
|
 |
bendesarts
Inscrit le: 27 Fév 2009 Messages: 234
|
Posté le: 22 Mai 2013 23:27 Sujet du message: |
|
|
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 |
|
 |
ALS
Inscrit le: 11 Sep 2006 Messages: 647
|
Posté le: 23 Mai 2013 11:44 Sujet du message: |
|
|
C'est une intuition, il faudrait peut-être poser la question sur mapleprimes.com. |
|
Revenir en haut de page |
|
 |
|
|
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
|

Développé par phpBB © 2001, 2006 phpBB Group
Traduction par : phpBB-fr.com
Apprendre Maple - © 05/05/2025
- Alain Le Stang - Navigation optimisée pour une résolution 1024 x 768.
|