IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MATLAB Discussion :

Comment faire une condition aux limites?


Sujet :

MATLAB

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Comment faire une condition aux limites?
    Salut à tous,

    je programme une simulation de pression hydraulique sous Matlab.

    J'utilise le solveur ode23s pour la résolution de l'équation différentielle de la pression et biensur lorsqu'il y a une dépression , la pression devient négative...

    Sauriez vous comment je programme une condition aux limites "p jamais négatif" dans la fonction qui resout l'equation de la pression?

    merci

  2. #2
    Membre confirmé
    Avatar de Dam2227
    Inscrit en
    Juin 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juin 2007
    Messages : 343
    Points : 487
    Points
    487
    Par défaut
    Salut

    Si j'ai bien compris le problème, tu ne calcules pas vraiment la pression, mais plutôt les écarts par rapport à une pression de référence (Pression atmosphérique?).

    Donc selon moi, il suffirait, dans ta solution finale, de rajouter cette pression de référence pour que tout redevienne positif.

    A+
    Matlab 7.14.0.739 (R2012a)
    C/C++, python, R, SQL, Pig, MR

    Ma philosophie: Ne rien faire, mais le faire bien.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Salut Dam2227,

    merci pour la réponse
    mais en fait, le solveur resoud le probleme à partir d'une série d'équation, je ne sais pas comment programmer une condition aux limites

    lors de la compression, pas de probleme, la pression augmente mais lors de la dépression, j'obtiens une courbe qui descent sans arret au lieu de s'applatir autours de 0 bars.


    j'ai essayé d'intégrer une simple condition du genre

    mais cela introduit une discontinuité dans la pression et ça ne donne pas de bon résultats.

  4. #4
    Membre confirmé
    Avatar de Dam2227
    Inscrit en
    Juin 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juin 2007
    Messages : 343
    Points : 487
    Points
    487
    Par défaut
    Je ne sais pas comment introduire une condition aux limites avec ode23s, ceci car à chaque fois que j'ai programmé des équations, les conditions aux limites étaient présentes intrinsèquement dans les équations.

    Maintenant, d'après ce que tu dis, je ne penses pas que mettre une condition aux limites arrangera les choses car comme tu le précises dans ton message, tu veux tout simplement que lorsque P<0, le programme mette sa valeur a 0 (ce qui va forcément induire une discontinuité). Ca, tu peux le faire en récupérant le vecteur contenant ta pression (une fois que toutes les valeurs aient été calculées) et en écrivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    P(P<0)=0;  %vecteur pression

    Es-tu sûr à 100% que tes équations sont correctes?
    Matlab 7.14.0.739 (R2012a)
    C/C++, python, R, SQL, Pig, MR

    Ma philosophie: Ne rien faire, mais le faire bien.

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    j'ai pris mes équations du logiciel d'hydraulique AMESim donc je pense que de ce coté la ça va, en plus quand je compare les résultats entre mon programme et amesim, j'obtiens les memes résultats à partir du moment où p>0

    je me suis mal exprimé pour la condition p<0.
    je fait un programme de simulation hydraulique sous matlab, du coup je dois trouver des résultats proches de la réalité... d'où la condition de pression positive indispensable.

  6. #6
    Membre confirmé
    Avatar de Dam2227
    Inscrit en
    Juin 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juin 2007
    Messages : 343
    Points : 487
    Points
    487
    Par défaut
    Ok

    Alors, est-ce que ce ne serait pas tout simplement un problème de domaine d'intégration? Tu intègrerais sur un domaine trop grand dans ce cas là? Si oui, alors il y a l'argument tspan (expliqué dans l'aide de Matlab (ode23s) qui pourrait t'être util).

    Sinon, et bien pourrais-tu poster un bout de ton code? A partir de là, ça sera plus facil pour tout le monde de comprendre ce qui passe^^.
    Matlab 7.14.0.739 (R2012a)
    C/C++, python, R, SQL, Pig, MR

    Ma philosophie: Ne rien faire, mais le faire bien.

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci de t'interesser à mon problème!

    voici mon code simplifié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    function dpdt = solver(t,...
        p,...%pression à calculer
        Cq,...%coefficient de débit
        S1,...%surface par laquelle le fluide s'échappe (variable)
        V,...%volume dans lequelle est le fluide (variable)
        dVdt,...%variation du volume dans lequelle est le fluide (variable)
        p_atm,...%pression de référence
        B);%Bulk modulus
     
    dpdt =0; %initialisation de dp/dt
     
    %  calcul de la surface et du volume au moment t par interpolation de S1  et V
    %----------------------------------------------------------------------
     
    A1 = interp1(S1(:,1),S1(:,2),t,'linear','extrap');
     
    V1 = interp1(V(:,1),V(:,2),t,'linear','extrap');
     
     
    % Calcul de Q, le débit sortant par la surface A1
    %----------------------------------------------------------------------
     
    Q = Cq*A1*sqrt(2*abs(p_atm-p)/rho)*sign(p_atm-p);
     
     
    % Calcul de QV1, débit du à la variation du volume
    %-----------------------------------------------
     
    QV1 = interp1(dVdt(:,1),dVdt(:,2),t,'linear','extrap');
     
    %equa. dif.
    %---------------------------------------------------------------------
    dpdt = [B/V1*(Q+QV1)]

  8. #8
    Membre éprouvé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2007
    Messages
    979
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 979
    Points : 1 256
    Points
    1 256
    Par défaut
    Une solution (pas très recommandée car elle perturbe la continuité ) serait de modifier la fonction à optimisé.
    Ce qui donne un code du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    % Mfun : la fonction à optimisé  
    NewFun = @(p)( Mfun + (p<0)*Inf );
    % Pour p<0  :  NewFun(p) = Inf
    A testé.

    ++ bonne chance
    AlloSchool, votre école sur internet.

  9. #9
    Membre confirmé
    Avatar de Dam2227
    Inscrit en
    Juin 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juin 2007
    Messages : 343
    Points : 487
    Points
    487
    Par défaut
    Oui, mais ça revient à faire le calcul de la fonction non modifée et ensuite enlever les valeurs qui ne nous interessent pas non?

    Sinon, je pense vraiment que c'est un problème d'interval d'intégration si les équations sont justes. Un peu comme quand on calcule la hauteur atteinte par un boulet de canon. Si on regarde les équations pendant un temps très long, et bien le boulet il rentre dans le sol^^, avec une hauteur négative. La condition aux limites étant ici h>0. Et c'est un problème purement physique. D'un point de vue mathématiques, c'est juste. Donc si tes équations sont bonnes et bien il me semble que les résultats sont bon aussi, et qu'il faut les tronquer quand les valeurs non plus de sens physique.

    Maintenant, je ne connais pas le problème en détail, mais je sais que j'ai eu ce problème il y a un petit moment et que j'étais aussi resté assez perplexe devant les résultats^^.

    Après, si c'est un problème venant de ton code, alors là, les responsables du forum trouveront surement l'erreur.

    Bon courage!
    Matlab 7.14.0.739 (R2012a)
    C/C++, python, R, SQL, Pig, MR

    Ma philosophie: Ne rien faire, mais le faire bien.

  10. #10
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    désolé ça marche pas mr_samurai...

    je dois mettre en évidence la cavitation donc il ne s'agit pas d'un probleme de domaine d'intégration.

  11. #11
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut!
    Le fait que tu utilises le programme ode23s semble indiquer que les grandeurs que tu veux calculer sont des fonctions du temps qui sont décrites par un système différentiel "stiff" et par des conditions initiales. Il s'agit d'un régime transitoire. Il nous serait beaucoup plus facile de t'aider si tu nous décrivais en détail ton problème et comment tu l'as mis en équations.
    D'autre part, dans ton dernier message, tu nous parles de cavitation. Es-tu conscient que, dans le cas de la cavitation, le volume occupé par le liquide diminue; il en résulte que ce sont tes équations différentielles (résultant de la discrétisation du domaine) qui changent de manière telle que la pression ne devient jamais négative.
    Jean-Marc Blanc
    Calcul numérique de processus industriels
    Formation, conseil, développement

    Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer. (Guillaume le Taiseux)

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/07/2009, 11h52
  2. comment faire une condition ou une instruction avec gtk
    Par Invité dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 31/05/2009, 16h06
  3. Comment faire une condition switch
    Par y-bab dans le forum IHM
    Réponses: 3
    Dernier message: 07/08/2008, 09h37
  4. Comment faire une condition en C#
    Par Calvein dans le forum ASP.NET
    Réponses: 3
    Dernier message: 02/06/2008, 10h31
  5. Réponses: 16
    Dernier message: 06/04/2007, 13h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo