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

Mathématiques Discussion :

Génération conditions initiales modélisant des bras spiraux galactiques


Sujet :

Mathématiques

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 60
    Points : 36
    Points
    36
    Par défaut Génération conditions initiales modélisant des bras spiraux galactiques
    j'ai besoin de générer des conditions initiales modélisant des bras spiraux galactiques.

    je pars de l'équation polaire suivante :

    rho=a./(log(b*tanh(theta/(2*n))) avec a, b et n des paramètres à choisir.

    pour donner une épaisseur le long de cette courbe dans la générations des points, j'ai fait les choses suivantes :

    - je génère des points dans un rectangle de largeur hx et de hauteur hy.
    - je décompose la courbe polaire en plusieurs segments delta(theta) puis je calcule la valeur du vecteur tangent à la courbe polaire en chacun des points du segments
    - je calcule l'angle que fait ce vecteur tangent avec le vecteur de la base canonique ex
    - j'applique la matrice de rotation avec cet angle à l'ensemble des points générés au début dans le rectangle de dimension hx et hy.
    - j'applique une translation de ces nouveaux points avec l'angle theta du point considéré (le point de la courbe correspondant au segment en question)

    à noter que je me suis arrangé pour diminuer l'épaisseur hy au fur et à mesure que theta croît.

    mais voilà, j'ai du mal à produire une épaisseur pour theta petit, c'est-à-dire pour reproduire la barre au milieu qui rejoint les 2 bras spiraux; voici un exemple de résultat :




    On voit même qu'il y a des artéfacts pour cette zone de theta petit.

    voici le code correspondant :

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    function test_arms
     
    % Total number of particles
    num_particles=25600;
    % Number of segments
    num_seg=6400;
    % Number of particules per segment
    num_part_seg=num_particles/(2*num_seg);
     
    % Parameters for curve
    a1=10;
    b1=0.5;
    n1=4;
     
    % Theta max
    theta_max=2.25*pi;
    % Width along curve
    width=2;
    % Hx width
    hx=theta_max/num_seg;
    % Hy width : decreasing with theta
    hy=width-width.*(1:num_seg)/num_seg;
    % Theta array
    t=0:hx:theta_max-hx;
    % Function values
    f1=a1./(log(b1*tanh(2*pi*t/(theta_max*(2*n1)))));
    % Derivates
    f11_prim=diff(f1)./diff(t);
    f12_prim=diff(-f1)./diff(t);
     
    f11_prim(num_seg)=0;
    f12_prim(num_seg)=0;
    % Tangent vector coordinates
    x_dom=(f11_prim-f1.*sin(t));
    y_dom=(f12_prim+f1.*cos(t));
    % Angle value with ex
    alpha11=-atan(y_dom./x_dom);
    alpha12=atan(-y_dom./x_dom);
     
     
    for i=1:num_seg
     
        % Random box coordinates for f1
        x11_first=hx*(rand(num_part_seg,1)-0.5);    
        y11_first=hy(i)*(rand(num_part_seg,1)-0.5);
     
        % Rotation matrix + translation
        x11((i-1)*num_part_seg+1:i*num_part_seg)=(x11_first*cos(alpha11(i))+y11_first*sin(alpha11(i)))+f1(i)*cos(t(i));
        y11((i-1)*num_part_seg+1:i*num_part_seg)=(-x11_first*sin(alpha11(i))+y11_first*cos(alpha11(i)))+f1(i)*sin(t(i));
     
        % Random box coordinates for -f1
        x12_first=hx*(rand(num_part_seg,1));    
        y12_first=hy(i)*(rand(num_part_seg,1)-0.5);
     
        % Rotation matrix + translation
        x12((i-1)*num_part_seg+1:i*num_part_seg)=(x12_first*cos(alpha12(i))+y12_first*sin(alpha12(i)))-f1(i)*cos(t(i));
        y12((i-1)*num_part_seg+1:i*num_part_seg)=(-x12_first*sin(alpha12(i))+y12_first*cos(alpha12(i)))-f1(i)*sin(t(i));
     
    end    
     
     
    figure(1);
    polar(t,f1);
    hold on;
    polar(t,-f1);
    hold on;
    scatter(x11,y11,1);
    hold on;
    scatter(x12,y12,1);
     
    end
    Je ne sais pas comment rectifier ce problème, si quelqu'un avait une piste, ça serait sympa

  2. #2
    Membre actif Avatar de SKone
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 333
    Points : 250
    Points
    250
    Par défaut
    As-tu avancé sur ce problème ?
    Est-ce un problème ? Au centre de la galaxy il y aurait un trou noir donc ton model pourrais être bon...

  3. #3
    Membre habitué
    Homme Profil pro
    Ingénieur en science de l'environnement
    Inscrit en
    Août 2013
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur en science de l'environnement

    Informations forums :
    Inscription : Août 2013
    Messages : 97
    Points : 149
    Points
    149
    Par défaut simplification
    Hello,

    Mathématiquement j'aime bien la méthode utilisé mais j'ai l'impression que tu pourrais grandement te simplifier la vie.

    Vu que tu as déjà la fonction f1:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f1=a1./(log(b1*tanh(2*pi*t/(theta_max*(2*n1)))));
    proposition:

    Disons que tu veux 25000 particules sur ton graph.

    Alors tu segmente ta courbe en fonction du nombre de particule que tu aimerais produire tu récupères ton vecteur [t;f1] 2x25000

    Et pour chaque point en coordonnées polaire (contenu dans [t;f1]) tu ajoutes une valeur random perpendiculairement à la tangente du point en question. Et au passage tu fais diminué les extrema de la valeur random pour qu'elle diminue en fonction de theta.

    Tu obtiens une belle galaxie uniforme donc la largeur diminue en fonction de theta.

    =) si tu veux je te fais le code pour tester.

Discussions similaires

  1. Réponses: 0
    Dernier message: 13/08/2014, 10h22
  2. Réponses: 7
    Dernier message: 28/09/2006, 01h30
  3. Modéliser des modèles de documents
    Par raoudi57 dans le forum Débuter
    Réponses: 5
    Dernier message: 10/11/2005, 20h23
  4. Modélisation des systèmes multiagents
    Par IMANE_nadjat dans le forum Intelligence artificielle
    Réponses: 1
    Dernier message: 10/11/2005, 11h00
  5. Conditions de destruction des instances de classes
    Par elvivo dans le forum Général Python
    Réponses: 4
    Dernier message: 29/12/2004, 17h16

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