Partage
  • Partager sur Facebook
  • Partager sur Twitter

Simulations physiques et problème d'effets de bord

    16 novembre 2014 à 19:46:20

    Bonjour,

    Je m'amuse en ce moment à simuler une onde se déplaçant dans un milieu parfait de dimension 1 (oui faut bien commencer par quelque chose) à partir de l'équation de d'Alembert que j'ai discrétisé. La simulation fonctionne plutôt bien lorsque je choisis bien mes paramètres, mais il reste un problème au bord : lorsque l'on atteint le bord elle rebondit comme si une deuxième onde s'était rajoutée, ce qui produit des effets de corde vibrante (voir encore plus délirant) assez étrange.

    J'ai essayé plusieurs contrôles sur les bords pour éviter ce problème (tout mettre à zéro, prendre la valeur directement à côté lorsque l'on commence à sortir du tableau, prendre la valeur à côté ET à l'instant précédent (cette solution étant celle qui semble le mieux fonctionner mais ce n'est pas parfait)) et j'ai toujours un problème... Voici un exemple de simulation, vous admettrez que le résultat est perturbant : https://owncloud.crans.org/public.php?service=files&t=873ddd4ae94b0216d7295b94fee69f4e.

    Avez vous des méthodes pour limiter les effets de bord ?

    Merci d'avance,

    Tobias.

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      16 novembre 2014 à 22:15:42

      Salut, ahah, c'est rigolo. :D Ton onde semble faire des interférences constructives avec elle-même. Si tu mets un déplacement moyen à 0 au bord, ça devrait limiter les dégâts en principe... Maintenant, comme on ne connait pas ta discrétisation, difficile de comprendre ce que tu veux dire par :

      prendre la valeur directement à côté lorsque l'on commence à sortir du tableau, prendre la valeur à côté ET à l'instant précédent

      Je pense que de bonnes vieilles équations parleraient mieux.

      Tu as aussi la condition aux bords dite "absorbante", qui doit être ce qu'il y a de plus propre pour limiter les effets de bords bizarres.

      • Partager sur Facebook
      • Partager sur Twitter
        17 novembre 2014 à 0:09:22

        Merci pour ta réponse !

        @dri1 a écrit:

        ahah, c'est rigolo. :D

        Ah je vois que je ne suis pas seul à être amusé par ces courbes ^^

        Modélisation

        Alors en ce qui concerne la discrétisation je suis parti d'un tableau 1D de 200 cases, à chaque étape je génère un nouveau tableau à l'étape t+dt (en pratique je travaille seulement avec trois tableau A,B,C, A étant l'étape à \(t+dt\) (que je cherche à calculer), B celle à \(t\) et C à \(t-dt\) ) en me basant sur la formule suivante que j'ai établi (si vous voulez la preuve just ask, mais elle découle simplement de l'équation de d'Alembert) : \[ u( x, t+dt ) = 2u(x,t) - u(x,t-dt) + dt ^ 2 v ^ 2 \frac{ u(x+dx,t)-2u(x,t) + u(x-dx,t) }{ dx ^ 2 } \]

        Implémentation

        D'un point de vue programmation je discrétise les x en \(x = n_x dx \) et les t en \(t = n_t dt \), ainsi lorsque j'accède à l'élément x-dx, j'accède en réalité à la case numéroté \(n_x-1\) dans mon tableau, et lorsque j'accède à \(u(x,t-dt)\) j'accède tout simplement à l'élément \(n_x\) du tableau C. (Je m'excuse si j'ai été un peu lourd sur ces explications)

        Problème

        Le problème c'est que la formule du dessus pose problème lorsque l'on est sur les bords du tableau (\(n_x = 200\) dans notre cas, (NB : on va considérer que le tableau est indexé à 1 pour éviter de se trimbaler des 199 partout)) car l'élément \(n_x = 201\) n'existe pas. Je suis alors obligé de lui fournir une valeur arbitraire.

        Essais de solutions

        J'ai ainsi essayé de lui donner la valeur 0, problème : le point à l'extrémité reste attaché et on voit quand même un rebond : on a l'impression que le corde est fixée en 0 et qu'on la fait vibrer comme une corde de guitare.

        Ensuite je me suis dit "pour des raisons de continuité il n'y a pas de raison qu'elle soit vraiment différente de sa voisine : on va lui donner la valeur B[200] ie B[201]=B[200]. Ceci donne lieu à des simulations comme ci joint au premier message... Pas convainquant.

        Enfin je me suis dit "Il ne reste plus qu'à essayer de lui donner la valeur qu'il y avait avant à la position 200 comme si elle s'était déplacée entre C et B, ie B[201] = C[200]. Ici l'onde retour est bien plus faible, mais reste visible, d'autant que l'erreur augmente avec le temps.

        Vers une meilleure solution ?

        Voila, j'espère avoir été clair. Par contre @dri1, pourrais-tu expliciter un peu la condition aux bords dite "absorbante" ?

        -- EDIT -- J'ai oublié de le préciser mais l'exitation de l'onde se fait simplement en imposant B[1] = sin(omega * dt)

        -
        Edité par little_programmeur 17 novembre 2014 à 0:22:40

        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          17 novembre 2014 à 1:17:05

          Ton schéma numérique a l'air correct, à première vue (et je dirais même que c'est du très bon boulot pour un élève au lycée).

          La condition absorbante, c'est finalement un peu cette idée d'interface complètement ouverte :

          Il ne reste plus qu'à essayer de lui donner la valeur qu'il y avait avant à la position 200 comme si elle s'était déplacée entre C et B, ie B[201] = C[200]

          mais en prenant en compte la vitesse de l'onde. Je pense que le plus simple serait alors de considérer une onde qui s'est avancée de \(v\mathrm dt\) et donc d'attribuer à \(u((n_x+1)\mathrm dx,t)\) la valeur \(u((n_x+1)\mathrm dx-v\mathrm dt,t-\mathrm dt)\) (en interpolant à partir de tes points de grille).

          -
          Edité par Anonyme 17 novembre 2014 à 1:20:03

          • Partager sur Facebook
          • Partager sur Twitter
            17 novembre 2014 à 4:07:46

            Avec cette méthode de simu il y a 2 solutions. Soit tu simules sur une domaine bcp plus grand que l'affichage de tel manière à ce que les réflexions ne soit pas vu, c'est moche et ça demande plus de puissance de calcul

            **blabla c'est des bêtises**

            edit: la solution d'@dri est la meilleur et est exact.

            -
            Edité par Vael 18 novembre 2014 à 22:56:11

            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              17 novembre 2014 à 17:18:13

              Avec cette méthode de simu il y a 2 solutions.

              Si c'étaient les deux seules solutions, on serait bien mal munis face aux cas plus compliqués où \(v\) est une fonction du temps et/ou de l'espace... :-°

              • Partager sur Facebook
              • Partager sur Twitter
                18 novembre 2014 à 14:17:09

                Hello,

                par curiosité, qu'est-ce que tu as pris comme valeurs de v, dt, et dx ?

                @+

                M.

                • Partager sur Facebook
                • Partager sur Twitter

                Avez-vous entendu parler de Julia ? Laissez-vous tenter ...

                  18 novembre 2014 à 22:50:28

                  @dri1 a écrit:

                  Si c'étaient les deux seules solutions, on serait bien mal munis face aux cas plus compliqués où \(v\) est une fonction du temps et/ou de l'espace... :-°


                  J'ai en effet perdu une occasion de me taire puisque ma seconde proposition est stupide en faite ... Et que ce que tu proposes devrait marcher de manière exact.
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    18 novembre 2014 à 23:55:50

                    J'ai en effet perdu une occasion de me taire puisque ma seconde proposition est stupide en faite ...

                    Je dirais plutôt que c'est la première (gonfler le domaine numérique pour ne pas laisser le temps aux conditions aux bords de s'exprimer) qui est problématique. En revanche, faire un monde circulaire n'est pas forcément stupide, c'est juste sacrément tordu d'aller utiliser la périodicité de la solution pour changer le système physique sans affecter la solution apparente et se débarrasser ainsi du problème des bords. :D

                    Et que ce que tu proposes devrait marcher de manière exact.

                    À l'erreur d'interpolation et l'erreur de la machine près. ^^

                    • Partager sur Facebook
                    • Partager sur Twitter
                      19 novembre 2014 à 1:29:23

                      @dri1 a écrit:

                      En revanche, faire un monde circulaire n'est pas forcément stupide, c'est juste sacrément tordu d'aller utiliser la périodicité de la solution pour changer le système physique sans affecter la solution apparente et se débarrasser ainsi du problème des bords. :D


                      En fait c'est vraiment utilisé dans certaines simulations avec des conservations de flux mais j'ai oublié les détails.

                      Mais la ça marche pas du tous car y a un régime "transitoire", donc faut vraiment commencer a bidouiller pour que ça marche...

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        19 novembre 2014 à 1:35:39

                        Je m'en suis servi une seule fois sur un cas simple de proie prédateur en 2 dimensions censé représenter du plancton dans l'océan. Comme la taille du système physique est infinie devant celle des structures à observer, on avait simplement fait un domaine torique en faisant l'hypothèse que le domaine numérique était comme une maille élémentaire du système physique.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          20 novembre 2014 à 23:19:05

                          Ok merci beaucoup pour vos réponses (et désolé du temps que j'ai mis à répondre), je vais essayer d'utiliser ta méthode @dri1. Le seul problème c'est que comme dt et dx sont discrets, il faut donc bien régler v (ou régler dt et dx en fonction de v) afin d'éviter de devoir prendre une case "entre deux cases" ou un temps "entre deux temps" (bon il y a toujours l'interpolation linéaire (ou non) mais plus on interpole plus on rajoute en calculs...).

                          Par contre cette solution ne passera pas telle qu'elle au niveau suivant de ma simulation, à savoir la modélisation d'un milieu dispersif (je ne l'ai pas encore modélisé, je suis encore à l'état de recherche). D'où une extension de ma question initiale pour les plus motivés : comment faire lorsque v(fréquence) n'est plus constante ? J'avais pensé utiliser aux extrémités un profil telle que la vitesse (quelle que soit la fréquence f) tendre petit à petit vers 0, afin de supprimer la réflexion. Il me semble que c'est une méthode utilisée dans les cuves à ondes pour éviter d'avoir un rebond de l'onde qui est physiquement simulé via une hauteur d'eau de plus en plus petite mais j'avoue que je ne sais pas si ça pourra répondre à mes besoins, ni même si il y a une courbure particulière à adopter.

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Anonyme
                            20 novembre 2014 à 23:30:57

                            (bon il y a toujours l'interpolation linéaire (ou non) mais plus on interpole plus on rajoute en calculs...).

                            Une interpolation sur un bord aura un coup négligeable devant les traitements fait dans le "volume" (linéique en l’occurrence) de ton milieu.

                            Par contre cette solution ne passera pas telle qu'elle au niveau suivant de ma simulation, à savoir la modélisation d'un milieu dispersif (je ne l'ai pas encore modélisé, je suis encore à l'état de recherche). D'où une extension de ma question initiale pour les plus motivés : comment faire lorsque v(fréquence) n'est plus constante ?

                            Ne pas passer par la vitesse directement, mais par le champ de contraintes. La condition absorbante est alors "contrainte nulle aux bords".

                            EDIT : j'avais pas vu que c'était une dépendance de la vitesse en fréquence. Dans ce cas, si tu as un spectre de fréquence discret et fini, tu peux traiter le problème fréquence par fréquence. Comme le problème est entièrement linéaire, tu n'auras pas de problème de convolution (mélange des fréquences).

                            -
                            Edité par Anonyme 20 novembre 2014 à 23:37:31

                            • Partager sur Facebook
                            • Partager sur Twitter
                              21 novembre 2014 à 13:00:36

                              @dri1 a écrit:

                              Une interpolation sur un bord aura un coup négligeable devant les traitements fait dans le "volume" (linéique en l’occurrence) de ton milieu.

                              Ah c'est vrai en effet :-°

                              @dri1 a écrit:

                              Dans ce cas, si tu as un spectre de fréquence discret et fini, tu peux traiter le problème fréquence par fréquence. Comme le problème est entièrement linéaire, tu n'auras pas de problème de convolution (mélange des fréquences).

                              J'y avais pensé mais ce que je n'aime pas est qu'il est alors nécessaire de faire une décomposition spectrale du signal (Cf. Transformée de Fourrier), et je n'aime pas trop cette idée. En effet il faut connaître le signal à l'avance pour pouvoir appliquer cette méthode, entièrement ou tout au moins sur quelques périodes (ça n'a pas de sens de décomposer un signal sur un temps d'une période infinitésimale) ce qui fait que cette solution ne me semble pas très physique surtout lorsque le signal est généré en temps réel : il faudrait alors accumuler le signal sur quelques périodes, le traiter, puis le renvoyer en décalé, ce qui est moche, (Lorsque je secoue une corde le signal est traité au fur et à mesure) sans parler des problèmes qu'il pourrait y avoir lors de la transformée de Fourrier d'un signal tronqué, ou encore des pertes dues à la discrétisation informatique des fréquences (sur quelle bande spectrale faut-il décomposer le signal ?)... Bref j'ai l'impression que c'est plus une commodité mathématique (très commode dans la vie de tous les jours je l'avoue) mais qu'elle ne reflète pas vraiment une réalité physique.

                              -
                              Edité par little_programmeur 21 novembre 2014 à 13:01:14

                              • Partager sur Facebook
                              • Partager sur Twitter
                              Anonyme
                                21 novembre 2014 à 14:07:58

                                J'ai dis une connerie plus haut, les contraintes nulles, c'est une surface libre, pas absorbante. Il faut que je réfléchisse au problème.

                                Concernant Fourier, tous les problèmes que tu soulèves n'en sont absolument pas. Puisqu'il ne s'agit évidemment pas de décomposer en séries de Fourier à chaque itération (en fait, ça se fait en analyse semi-spectrale, mais c'est hyper coûteux), mais de résoudre le problème en fréquence (dans l'espace réciproque) et non dans l'espace physique. Résoudre un problème dans l'espace spectral, quand c'est possible, ça te permet d'atteindre la meilleure précision possible du monde de la modélisation numérique. Parfois, c'est même l'une des solutions les plus simples. À tel point que Fourier a mis au point sa décomposition pour résoudre l'équation de la chaleur. Gauss a mis au point les harmoniques sphériques (Fourier sur une sphère, en quelque sorte) pour décomposer le champ magnétique terrestre (et en accessoirement déduit plein de trucs cool, comme le fait que le principal du champ était d'origine interne).

                                Si l'espace réciproque n'existe pas en vrai, il reflète cependant une réalité physique bien réelle, qui est celle que tout ce que tu vois comme des fonctions lisses peut être vu comme une collection de fréquence. On s'aperçoit alors que certains phénomènes physiques ne mélangent pas les fréquences (comme la diffusion, qui ne fait qu'atténuer les amplitudes), d'autre convolent joyeusement les signaux.

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  21 novembre 2014 à 16:05:52

                                  Je ne voudrais pas dire de bêtises, mais dans le cas d'un milieu dispersif, est-ce qu'on ne pourrait pas prendre simplement la condition limite non dispersive en introduisant le déphasage dû à la dispersion ?

                                  -
                                  Edité par Nozio 21 novembre 2014 à 16:07:00

                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Avez-vous entendu parler de Julia ? Laissez-vous tenter ...

                                    24 novembre 2014 à 14:11:39

                                    Bonjour,  

                                    une remarque sur les conditions d'extrémités pour simuler un milieu infini ( ondes progressives) à partir d'un petit programme SCILAB  que j'ai réalisé. ( avec résolution matricielle  utilisant les programmes de traitement des matrices creuses : ici on a  une matrice trigonale avec 3*n termes à stocker au lieu de \(n^2\).)  

                                    Mais par rapport à ce qui a été dit, l'équation de d’Alembert complète présente un terme source \(F(x,t)\) nécessaire pour simuler complètement le comportement( transitoire et établissement d'un régime permanent éventuel ) suite à une excitation externe quelconque.

                                    J'utilise ce terme source pour les conditions de bord et simuler une force de rappel  de la forme \(F=-Z \frac{\partial u}{\partial t}\) sur une extrémité avec conditions limite libre .  Z est l'impédance adaptative  à l'interface dont va dépendre la part transmise et  la part réfléchi du signal. 

                                      J'ai fait quelques validations de  ce modèle d'impédance adaptative aux bords; j'indique  trois tests  qui semblent bien correspondre à ce que l'on attend:

                                    1- je compare l'onde obtenue sur une longueur L avec modèle d'impédance en sortie à celle obtenue classiquement sur une longueur par exemple 3L ( qui est donc à peu prés équivalente en L à une onde progressive, indépendante de la condition d'extrémité en 3L). Pour une certaine impédance Z les deux ondes coïncident à la précision numérique prés.

                                    2- j'utilise le modèle avec impédance  pour observer comment se réfléchit ou non un signal impulsé à l'origine. ( créneau ou triangle par exemple)

                                    Z=0 j'observe la réflexion totale attendue ( inversée ou non selon la condition en u(L,t)

                                    au fur et a mesure que Z augmente, j'observe une réflexion dont l'amplitude est de plus en plus atténuée.

                                    pour Z égal à l'impédance adaptée à un milieu infini   , j'observe la disparition du signal ( réflexion nulle , transmission totale)

                                    3- en simulant une excitation périodique, j'observe avec Z=0, l'établissement d'un régime stationnaire ( noeuds et ventres fixes).  Si je fixe Z à l'impédance adaptée, j'observe la progression de l'onde comme en milieu infini. 

                                    -
                                    Edité par Sennacherib 24 novembre 2014 à 14:14:47

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    tout ce qui est simple est faux, tout ce qui est compliqué est inutilisable

                                    Simulations physiques et problème d'effets de bord

                                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                    • Editeur
                                    • Markdown