Message d'erreur sur matlab
Résolu
atiffa
Messages postés
54
Date d'inscription
Statut
Membre
Dernière intervention
-
Sacabouffe Messages postés 9427 Date d'inscription Statut Membre Dernière intervention -
Sacabouffe Messages postés 9427 Date d'inscription Statut Membre Dernière intervention -
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
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
A voir également:
- Message d'erreur sur matlab
- Comment recuperer un message supprimé sur whatsapp - Guide
- Message supprimé whatsapp - Guide
- Message absence thunderbird - Guide
- Comment epingler un message sur whatsapp - Accueil - Messagerie instantanée
- Message du pere noel gratuit whatsapp - Accueil - Messagerie instantanée
11 réponses
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
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
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
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
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
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
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...
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 :-)
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 ;-)