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
Bonjour,

J'ai un problème avec mon code sur matlab
je veux que sa simule des variations de certains variables sur une intervalle de temps qui varie entre 0 et 200 secondes
le logiciel m'affiche un message d'erreur que pour moi reste pas trop clair

le message est la suivante:

""""""""""""""""""""""""""""""""""
Warning: Failure at t=2.413332e-09. Unable to meet integration tolerances without reducing the step size below the smallest
value allowed (6.617445e-24) at time t.
> In ode15s at 751
In eqadif2 at 56
In funfun/private/odearguments at 110
In ode15s at 228
In eqadif2 at 56
In funfun/private/odearguments at 110
In ode15s at 228
K>>
"""""""""""""""""""""""""""""""""""""""""""""""""

si qlqu'un peut m'expliquer ce que je doit faire pour m'en sortir

je vous remercie beaucoup

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
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)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
3
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
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
1
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
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
1
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
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
0

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
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))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
0
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
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
0
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
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.
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...
0
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
Merci sacabouffe
je vais essayer ce que tu ma dit et je te dirais les résultats

Merci
à plus
0
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
OK
À plus tard ;-)
0
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
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 :-)
0
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
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 ;-)
warning off MATLAB:nearlySingularMatrix
Par 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 ;-)
0