Message d'erreur sur matlab
Résolu/Fermé
atiffa
Messages postés
54
Date d'inscription
lundi 4 février 2008
Statut
Membre
Dernière intervention
10 juin 2009
-
1 août 2008 à 14:15
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 - 23 sept. 2008 à 19:50
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 - 23 sept. 2008 à 19:50
A voir également:
- Message d'erreur sur matlab
- Message - Guide
- Erreur 0x80070643 - Accueil - Windows
- Comment recuperer un message supprimé sur whatsapp - Guide
- Message d'absence thunderbird - Guide
- Erreur 0x80070643 Windows 10 : comment résoudre le problème de la mise à jour KB5001716 - Accueil - Windows
11 réponses
Sacabouffe
Messages postés
9427
Date d'inscription
dimanche 19 août 2007
Statut
Membre
Dernière intervention
29 mai 2009
1 834
1 août 2008 à 18:36
1 août 2008 à 18:36
Salut
Notant y'=f(t,y) ton équation différentielle, ce genre de gags se produit quand la Jacobienne ∂f/∂y est critique (elle peut l'être pour MatLab sans pour autant l'être réellement, eh oui... les erreurs numériques...).
Prenons un exemple où elle l'est réellement.
Soit y(t)=³√t, alors on sait que y'(t)=1/(3(³√t)²), c'est-à-dire y'(t)=1/(3*y(t)²) et que donc, y vérifie l'équation différentielle y'=f(t,y) où f(t,y)=1/(3y²) avec la condition initiale y(-1)=-1. Seulement ∂f/∂y(t,0) n'est pas définie, ce qui tout à fait normal puisque la dérivée de la fonction racine cubique n'est pas définie en 0.
Si maintenant t'essaies de résoudre cet équation différentielle avec ode15s, il y a la même cochonnerie que pour ton équation différentielle parce que MatLab arrive pas à calculer la Jacobienne dont il a besoin.
Pour éviter ce genre de saloperies, il y a plusieurs solutions.
1) Si ta Jacobienne analytique n'est pas critique et que tu peux la calculer, tu la passes en argument au solveur avec odeset. Tape help odeset ou doc odeset pour avoir plus d'infos.
2) Bidouiller, toujours en jouant sur les options que tu peux passer par odeset. Pour l'exemple que je viens de te donner, on peut par exemple changer un peu la tolérance pour l'erreur relative ou la tolérance pour l'erreur absolue...
Il y a d'autres options que tu peux passer, regarde tout ça dans la documentation.
3) Résoudre ton équation différentielle en deux fois. Tu lances une première fois la résolution, tu récupères la localisation de l'erreur, tu fais deux ou trois trucs, et hop, tu repars d'un peu après le point qui pose problème à MatLab.
Ciao
Notant y'=f(t,y) ton équation différentielle, ce genre de gags se produit quand la Jacobienne ∂f/∂y est critique (elle peut l'être pour MatLab sans pour autant l'être réellement, eh oui... les erreurs numériques...).
Prenons un exemple où elle l'est réellement.
Soit y(t)=³√t, alors on sait que y'(t)=1/(3(³√t)²), c'est-à-dire y'(t)=1/(3*y(t)²) et que donc, y vérifie l'équation différentielle y'=f(t,y) où f(t,y)=1/(3y²) avec la condition initiale y(-1)=-1. Seulement ∂f/∂y(t,0) n'est pas définie, ce qui tout à fait normal puisque la dérivée de la fonction racine cubique n'est pas définie en 0.
Si maintenant t'essaies de résoudre cet équation différentielle avec ode15s, il y a la même cochonnerie que pour ton équation différentielle parce que MatLab arrive pas à calculer la Jacobienne dont il a besoin.
dy=@(t,y)(1/(3*y^2)); tspan = [-1 1]; sol = ode15s(dy,tspan,-1);Le message d'erreur suivant s'affiche
Warning: Failure at t=-7.495074e-001. Unable to meet integration tolerances without reducing the step size below the smallest value allowed (1.776357e-015) at time t.Les messages d'erreur qui suivent pour ton programme doivent juste être une conséquence du premier. À voir...
Pour éviter ce genre de saloperies, il y a plusieurs solutions.
1) Si ta Jacobienne analytique n'est pas critique et que tu peux la calculer, tu la passes en argument au solveur avec odeset. Tape help odeset ou doc odeset pour avoir plus d'infos.
2) Bidouiller, toujours en jouant sur les options que tu peux passer par odeset. Pour l'exemple que je viens de te donner, on peut par exemple changer un peu la tolérance pour l'erreur relative ou la tolérance pour l'erreur absolue...
dy=@(t,y)(1/(3*y^2)); tspan = [-1 1]; options=odeset('AbsTol',1e-5); %% Elle est de 1e-6 par défaut sol = ode15s(dy,tspan,-1,options);Et là ça passe...
Il y a d'autres options que tu peux passer, regarde tout ça dans la documentation.
3) Résoudre ton équation différentielle en deux fois. Tu lances une première fois la résolution, tu récupères la localisation de l'erreur, tu fais deux ou trois trucs, et hop, tu repars d'un peu après le point qui pose problème à MatLab.
Ciao
atiffa
Messages postés
54
Date d'inscription
lundi 4 février 2008
Statut
Membre
Dernière intervention
10 juin 2009
12
6 août 2008 à 12:44
6 août 2008 à 12:44
Bonjour Sacabouffe,
On fait voilà, j'ai essayer de varier les valeurs de la tolérance relative et absolue mais ça n'a rien donner
je pense pas que l'erreur viens de ca !!!!!!!!!!!!
je suis toujours coincer
on tout cas je te remercie beucoup tu etait toujours au service des autres
c'est vraiment sympa de ta part
merci encore
à plus
On fait voilà, j'ai essayer de varier les valeurs de la tolérance relative et absolue mais ça n'a rien donner
je pense pas que l'erreur viens de ca !!!!!!!!!!!!
je suis toujours coincer
on tout cas je te remercie beucoup tu etait toujours au service des autres
c'est vraiment sympa de ta part
merci encore
à plus
Sacabouffe
Messages postés
9427
Date d'inscription
dimanche 19 août 2007
Statut
Membre
Dernière intervention
29 mai 2009
1 834
6 août 2008 à 18:17
6 août 2008 à 18:17
Salut atiffa
En fait il y a beaucoup de monde qui rend service ici. Tu peux le faire aussi d'ailleurs, certaines personnes pourront te répondre sur un truc parce qu'elle maîtrise le domaine qui te pose problème, mais pourront avoir besoin de tes compétences à toi sur autre chose ;-)
Enfin voilà... donc pour ton problème... sans l'équation différentielle sous les yeux, c'est pas facile de dire.
1) Soit ton équation différentielle est vraiment régulière et dans ce cas, il y a des chances qu'il s'agisse d'une erreur de programmation.
2) Soit ton équation différentielle est régulière mais numériquement pas.
3) Soit ton équation différentielle ne vérifie pas les conditions nécessaires pour que le théorème de Cauchy-Lipschitz assure l'existence et l'unicité locale de la solution et tu te trouves face à une équation différentielle pas très propre.
Pour les solutions...
1) Ben... relis encore ton code... :-DDD
2) Bidouille les autres options que tu peux passer à odeset ou résouds ton équation en deux fois:
* Pour les options, essaie de passer la Jacobienne si c'est possible (message 2).
* Pour résoudre en deux fois (message 2), tu évites l'évènement qui pose souci.
C'est ce qui est fait si tu regardes l'exemple de la balle rebondissante dans l'aide MatLab. Tu cherches ballode dans les exemples d'ODEs.
A plus
En fait il y a beaucoup de monde qui rend service ici. Tu peux le faire aussi d'ailleurs, certaines personnes pourront te répondre sur un truc parce qu'elle maîtrise le domaine qui te pose problème, mais pourront avoir besoin de tes compétences à toi sur autre chose ;-)
Enfin voilà... donc pour ton problème... sans l'équation différentielle sous les yeux, c'est pas facile de dire.
1) Soit ton équation différentielle est vraiment régulière et dans ce cas, il y a des chances qu'il s'agisse d'une erreur de programmation.
2) Soit ton équation différentielle est régulière mais numériquement pas.
3) Soit ton équation différentielle ne vérifie pas les conditions nécessaires pour que le théorème de Cauchy-Lipschitz assure l'existence et l'unicité locale de la solution et tu te trouves face à une équation différentielle pas très propre.
Pour les solutions...
1) Ben... relis encore ton code... :-DDD
2) Bidouille les autres options que tu peux passer à odeset ou résouds ton équation en deux fois:
* Pour les options, essaie de passer la Jacobienne si c'est possible (message 2).
* Pour résoudre en deux fois (message 2), tu évites l'évènement qui pose souci.
C'est ce qui est fait si tu regardes l'exemple de la balle rebondissante dans l'aide MatLab. Tu cherches ballode dans les exemples d'ODEs.
A plus
atiffa
Messages postés
54
Date d'inscription
lundi 4 février 2008
Statut
Membre
Dernière intervention
10 juin 2009
12
2 août 2008 à 22:26
2 août 2008 à 22:26
Bonsoir Sacabouffe,
Je te remercie pour ton aide, mais j'ai quand même un petit soucis, j'arrive pas à comprendre comment je doit déterminer la valeur RelTol et AbsTol ????????????????????
Je te remercier pour ta gentillesse et pour ton aide
Merci
A plus
Je te remercie pour ton aide, mais j'ai quand même un petit soucis, j'arrive pas à comprendre comment je doit déterminer la valeur RelTol et AbsTol ????????????????????
Je te remercier pour ta gentillesse et pour ton aide
Merci
A plus
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Sacabouffe
Messages postés
9427
Date d'inscription
dimanche 19 août 2007
Statut
Membre
Dernière intervention
29 mai 2009
1 834
2 août 2008 à 22:51
2 août 2008 à 22:51
Salut attifa
Bidouille un peu les deux mais essaie quand même de faire un truc plus ou moins propre.
RelTol est la tolérance relative et AbsTol c'est la tolérance absolue. Tout ça est dit dans l'aide MatLab. Pour résoudre ton équation différentielle, MatLab évalue à chaque pas de discrétisation l'erreur e entre la solution exacte et la solution approchée. Cette erreur doit vérifier la relation |e(i)| ≤ max(RelTol*abs(y(i)),AbsTol(i)) où y est la solution de ton équation différentielle.
Modifie un peu les paramètres par défaut qui sont de 1e-3 pour la tolérance relative et 1e-6 pour voir si ça change quelque chose pour ta résolution. Si tu les modifies trop, t'obtiendras certainement une solution très mauvaise, dans ce cas essaie autre chose pour résoudre ton problème.
Bonne soirée
Bidouille un peu les deux mais essaie quand même de faire un truc plus ou moins propre.
RelTol est la tolérance relative et AbsTol c'est la tolérance absolue. Tout ça est dit dans l'aide MatLab. Pour résoudre ton équation différentielle, MatLab évalue à chaque pas de discrétisation l'erreur e entre la solution exacte et la solution approchée. Cette erreur doit vérifier la relation |e(i)| ≤ max(RelTol*abs(y(i)),AbsTol(i)) où y est la solution de ton équation différentielle.
Modifie un peu les paramètres par défaut qui sont de 1e-3 pour la tolérance relative et 1e-6 pour voir si ça change quelque chose pour ta résolution. Si tu les modifies trop, t'obtiendras certainement une solution très mauvaise, dans ce cas essaie autre chose pour résoudre ton problème.
Bonne soirée
atiffa
Messages postés
54
Date d'inscription
lundi 4 février 2008
Statut
Membre
Dernière intervention
10 juin 2009
12
22 août 2008 à 12:45
22 août 2008 à 12:45
Bonjour sacabouffe,
on fait j'ai relis plusieurs fois mon code et je pense que le problème viens du fait que j'ai des équations des certains systèmes tampons qui se font rapidement et des autres réactions qui sont lentes
Je sais pas comment on résoudre se probléme sur matlab
je sais pas si tu as une aidée
Je te remercie d'avance
on fait j'ai relis plusieurs fois mon code et je pense que le problème viens du fait que j'ai des équations des certains systèmes tampons qui se font rapidement et des autres réactions qui sont lentes
Je sais pas comment on résoudre se probléme sur matlab
je sais pas si tu as une aidée
Je te remercie d'avance
Sacabouffe
Messages postés
9427
Date d'inscription
dimanche 19 août 2007
Statut
Membre
Dernière intervention
29 mai 2009
1 834
27 août 2008 à 00:48
27 août 2008 à 00:48
Salut atiffa
Tu peux aussi essayer de modifier la borne supérieure du pas de discrétisation que MatLab choisit par défaut. Elle est de 1/10 de la longueur de ton intervalle
L'exemple que je t'avais donné au message 2 ne passait pas.
Voili, voilou...
Tu peux aussi essayer de modifier la borne supérieure du pas de discrétisation que MatLab choisit par défaut. Elle est de 1/10 de la longueur de ton intervalle
L'exemple que je t'avais donné au message 2 ne passait pas.
dy=@(t,y)(1/(3*y^2)); tspan = [-1 1]; sol = ode15s(dy,tspan,-1,options);En revanche, en changeant cette borne.
options = odeset('MaxStep',0.002); dy=@(t,y)(1/(3*y^2)); tspan = [-1 1]; sol = ode15s(dy,tspan,-1,options);Le calcul passe.
Voili, voilou...
atiffa
Messages postés
54
Date d'inscription
lundi 4 février 2008
Statut
Membre
Dernière intervention
10 juin 2009
12
28 août 2008 à 13:20
28 août 2008 à 13:20
Merci sacabouffe
je vais essayer ce que tu ma dit et je te dirais les résultats
Merci
à plus
je vais essayer ce que tu ma dit et je te dirais les résultats
Merci
à plus
Sacabouffe
Messages postés
9427
Date d'inscription
dimanche 19 août 2007
Statut
Membre
Dernière intervention
29 mai 2009
1 834
28 août 2008 à 14:06
28 août 2008 à 14:06
OK
À plus tard ;-)
À plus tard ;-)
atiffa
Messages postés
54
Date d'inscription
lundi 4 février 2008
Statut
Membre
Dernière intervention
10 juin 2009
12
17 sept. 2008 à 12:37
17 sept. 2008 à 12:37
Bonjour sacabouffe,
J'ai essayer ce que tu ma dit mais ca marche pas,
j'ai essayer des autres modifications dans les équations de mon programme et j'ai toujours le même problème
Là je fait tourner mon programme et le message d'erreur qui s'affiche est la suivante:
""""""""""""""""""""""""""
In ode15s at 674
Warning: Matrix is singular, close to singular or badly scaled.
Results may be inaccurate. RCOND = NaN.
""""""""""""""""""""""""""""""""
est ce que tu pourra m'aider ???????????
Je te remercie d'avance
attifa :-)
J'ai essayer ce que tu ma dit mais ca marche pas,
j'ai essayer des autres modifications dans les équations de mon programme et j'ai toujours le même problème
Là je fait tourner mon programme et le message d'erreur qui s'affiche est la suivante:
""""""""""""""""""""""""""
In ode15s at 674
Warning: Matrix is singular, close to singular or badly scaled.
Results may be inaccurate. RCOND = NaN.
""""""""""""""""""""""""""""""""
est ce que tu pourra m'aider ???????????
Je te remercie d'avance
attifa :-)
Sacabouffe
Messages postés
9427
Date d'inscription
dimanche 19 août 2007
Statut
Membre
Dernière intervention
29 mai 2009
1 834
23 sept. 2008 à 19:50
23 sept. 2008 à 19:50
Salut
C'est pas un message d'erreur que t'obtiens atiffa, c'est un message d'avertissement.
Ça te dit juste que tu as une matrice qui est soit singulière, soit très proche d'une matrice singulière, soit mal conditionnée, et que du coup, tes résultats seronbt peut-être inexacts.
Si t'as juste ça, normalement, ton programme tourne jusqu'au bout.
T'obtiens des résultats corrects malgré ce souci de matrice ?
Si c'est le cas et que tu veux pas voir ce warning, tu peux faire ça avant l'exécution du programme, ça clouera le bec à MatLab ;-)
T'utilises une matrice de masse dans ton équation différentielle ?
J'ai essayé de reproduire ce warning avec ode15s, avec et sans matrice de masse, et ben... pas moyen... C'est toujours quand on les veut que les erreurs veulent pas montrer le bout de leur nez. Par contre, quand on veut qu'un code marche, il y a pas de souci, on a toutes les erreurs qu'il faut. C'est ce qu'on appelle la loi de Murphy :-DDD
Dis m'en plus pour ton code.
Bonne soirée ;-)
C'est pas un message d'erreur que t'obtiens atiffa, c'est un message d'avertissement.
Ça te dit juste que tu as une matrice qui est soit singulière, soit très proche d'une matrice singulière, soit mal conditionnée, et que du coup, tes résultats seronbt peut-être inexacts.
Si t'as juste ça, normalement, ton programme tourne jusqu'au bout.
T'obtiens des résultats corrects malgré ce souci de matrice ?
Si c'est le cas et que tu veux pas voir ce warning, tu peux faire ça avant l'exécution du programme, ça clouera le bec à MatLab ;-)
warning off MATLAB:nearlySingularMatrixPar contre, si t'es résultats sont pas corrects, là pour le coup, je vois pas d'où peut venir ce warning :-(
T'utilises une matrice de masse dans ton équation différentielle ?
J'ai essayé de reproduire ce warning avec ode15s, avec et sans matrice de masse, et ben... pas moyen... C'est toujours quand on les veut que les erreurs veulent pas montrer le bout de leur nez. Par contre, quand on veut qu'un code marche, il y a pas de souci, on a toutes les erreurs qu'il faut. C'est ce qu'on appelle la loi de Murphy :-DDD
Dis m'en plus pour ton code.
Bonne soirée ;-)