begin process at 2012 05 27 19:05:54
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > RESSORTS

RESSORTS


 Information sur la source

Note :
Aucune note
Catégorie :Maths & Algorithmes Classé sous :ressort, physique, math, équantion, différentielle Niveau :Débutant Date de création :05/08/2005 Date de mise à jour :06/08/2005 16:04:27 Vu / téléchargé :4 206 / 170

Auteur : JCDjcd

Ecrire un message privé
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (11)
Ajouter un commentaire et/ou une note


 Description

Cliquez pour voir la capture en taille normale
voici un petit programme qui montre graphiquement la solution du probleme suivant :
le probleme est de resoudre l'equation differentielle d'un systeme compose de 3 masses A, B, et C dont chacune est reliees par un ressort (ki,l0i) avec i=A,B ou C, et k la constante de raideur et l0 la longeur a vide

je mets ci-dessous le fonction de l'equation differentielle (il faut voir la suite du code dans main.c pour les conditions initiales)
Les equa. diff. sont resolues avec du Runge-Kutta a pas adaptatif.

Source

  • //-------------------------------------------------
  • typedef struct tagRESSORT
  • {
  • double k; // constante de raideur
  • double l0; // longeur a vide
  • }RESSORT,*P_RESSORT,**PP_RESSORT;
  • // il y a 3 masses A, B, et C
  • // liees par des ressorts
  • typedef struct tagEQUATION
  • {
  • // les donnees
  • double mA,mB,mC; // masses
  • RESSORT rAB,rAC,rBC; // les trois ressorts
  • // informations pour le dessin
  • COLORREF cA,cB,cC; // couleurs des masses
  • COLORREF cRessorts; // couleurs des ressorts
  • DWORD t0;
  • double alpha; // facteur d'amortissement
  • // l'integrateur d'equations differentielles
  • ODE_RK rk;
  • }EQUATION,*P_EQUATION,**PP_EQUATION;
  • //-------------------------------------------------
  • // 12 valeurs : (3 masses) * (position (x,y) + vitesse (vx,vy)) = (3)*(2+2) = 12
  • //-------------------------------------------------
  • #define INDEX_XA 0
  • #define INDEX_YA 1
  • #define INDEX_VXA 2
  • #define INDEX_VYA 3
  • #define INDEX_XB 4
  • #define INDEX_YB 5
  • #define INDEX_VXB 6
  • #define INDEX_VYB 7
  • #define INDEX_XC 8
  • #define INDEX_YC 9
  • #define INDEX_VXC 10
  • #define INDEX_VYC 11
  • //-------------------------------------------------
  • // 12 valeurs : (3 masses) * (vitesse (vx,vy) + acceleration (ax,ay)) = (3)*(2+2) = 12
  • //-------------------------------------------------
  • #define DINDEX_VXA 0
  • #define DINDEX_VYA 1
  • #define DINDEX_AXA 2
  • #define DINDEX_AYA 3
  • #define DINDEX_VXB 4
  • #define DINDEX_VYB 5
  • #define DINDEX_AXB 6
  • #define DINDEX_AYB 7
  • #define DINDEX_VXC 8
  • #define DINDEX_VYC 9
  • #define DINDEX_AXC 10
  • #define DINDEX_AYC 11
  • //-------------------------------------------------
  • // on cherche a resoudre Y'=f(X,Y)
  • // avec X un scalaire, et Y et Y' sont des vecteurs (12 dimensions) :
  • // Y = ( xA ) Y' = ( vxA ) <-- masse A
  • // ( yA ) ( vyA )
  • // ( vxA ) ( axA )
  • // ( vyA ) ( ayA )
  • // ( xB ) ( vxB ) <-- masse B
  • // ( yB ) ( vyB )
  • // ( vxB ) ( axB )
  • // ( vyB ) ( ayB )
  • // ( xC ) ( vxC ) <-- masse C
  • // ( yC ) ( vyC )
  • // ( vxC ) ( axC )
  • // ( vyC ) ( ayC )
  • //
  • // ici dans cette fonction <res> est le vecteur Y' que l'on doit calculer
  • BOOL funcEquaDiff(P_VECTND res,double x,P_VECTND y,void *param)
  • {
  • P_EQUATION eq;
  • double FAB,FAC,FBC; // les forces (en norme relative +/-)
  • double lAB,lAC,lBC; // les longueurs
  • double angleAB,angleAC,angleBC; // les angles des droites (AB), (AC), et (BC)
  • double dxAB,dyAB; // variables utiles (calcul des longueurs et des angles)
  • double dxAC,dyAC; // variables utiles (calcul des longueurs et des angles)
  • double dxBC,dyBC; // variables utiles (calcul des longueurs et des angles)
  • eq = (P_EQUATION)param;
  • AssertPointer(eq);
  • // le probleme des vitesses est trivial,
  • // puisque l'on nous les donne
  • res->coord[DINDEX_VXA] = y->coord[INDEX_VXA]; // masse A
  • res->coord[DINDEX_VYA] = y->coord[INDEX_VYA];
  • res->coord[DINDEX_VXB] = y->coord[INDEX_VXB]; // masse B
  • res->coord[DINDEX_VYB] = y->coord[INDEX_VYB];
  • res->coord[DINDEX_VXC] = y->coord[INDEX_VXC]; // masse C
  • res->coord[DINDEX_VYC] = y->coord[INDEX_VYC];
  • // passons aux choses serieuses, l'accelerations des masses
  • // est donnees par le PFD (principe fondamental de la dynamique)
  • // a=F/m, de plus on sait calculer F pour des ressorts : F = - k.(l-l0)
  • // * on calcule les longueurs
  • dxAB = y->coord[INDEX_XB] - y->coord[INDEX_XA]; // longueur entre A et B
  • dyAB = y->coord[INDEX_YB] - y->coord[INDEX_YA];
  • lAB = sqrt(dxAB*dxAB + dyAB*dyAB);
  • dxAC = y->coord[INDEX_XC] - y->coord[INDEX_XA]; // longueur entre A et C
  • dyAC = y->coord[INDEX_YC] - y->coord[INDEX_YA];
  • lAC = sqrt(dxAC*dxAC + dyAC*dyAC);
  • dxBC = y->coord[INDEX_XC] - y->coord[INDEX_XB]; // longueur entre B et C
  • dyBC = y->coord[INDEX_YC] - y->coord[INDEX_YB];
  • lBC = sqrt(dxBC*dxBC + dyBC*dyBC);
  • // * on calcule les forces
  • FAB = - eq->rAB.k * (lAB - eq->rAB.l0);
  • FAC = - eq->rAC.k * (lAC - eq->rAC.l0);
  • FBC = - eq->rBC.k * (lBC - eq->rBC.l0);
  • // * on calcule les angles (sens trigonometrique)
  • angleAB = atan2(dyAB,dxAB);
  • angleAC = atan2(dyAC,dxAC);
  • angleBC = atan2(dyBC,dxBC);
  • // * on calcule les accelerations (attention aux signes)
  • res->coord[DINDEX_AXA] = ((- FAB*cos(angleAB) - FAC*cos(angleAC))/eq->mA) - eq->alpha*y->coord[INDEX_VXA]; // masse A
  • res->coord[DINDEX_AYA] = ((- FAB*sin(angleAB) - FAC*sin(angleAC))/eq->mA) - eq->alpha*y->coord[INDEX_VYA];
  • res->coord[DINDEX_AXB] = ((+ FAB*cos(angleAB) - FBC*cos(angleBC))/eq->mB) - eq->alpha*y->coord[INDEX_VXB]; // masse B
  • res->coord[DINDEX_AYB] = ((+ FAB*sin(angleAB) - FBC*sin(angleBC))/eq->mB) - eq->alpha*y->coord[INDEX_VYB];
  • res->coord[DINDEX_AXC] = ((+ FAC*cos(angleAC) + FBC*cos(angleBC))/eq->mC) - eq->alpha*y->coord[INDEX_VXC]; // masse C
  • res->coord[DINDEX_AYC] = ((+ FAC*sin(angleAC) + FBC*sin(angleBC))/eq->mC) - eq->alpha*y->coord[INDEX_VYC];
  • return TRUE;
  • } // funcEquaDiff()
//-------------------------------------------------
typedef struct tagRESSORT
  {
  double    k;   // constante de raideur
  double    l0;  // longeur a vide
  }RESSORT,*P_RESSORT,**PP_RESSORT;

//  il y a 3 masses A, B, et C
// liees par des ressorts
typedef struct tagEQUATION
  {
  // les donnees
  double    mA,mB,mC;       // masses
  RESSORT   rAB,rAC,rBC;    // les trois ressorts  
  
  // informations pour le dessin  
  COLORREF  cA,cB,cC;       // couleurs des masses
  COLORREF  cRessorts;      // couleurs des ressorts
  DWORD     t0;

  double    alpha;          // facteur d'amortissement
  
  // l'integrateur d'equations differentielles
  ODE_RK  rk;
  }EQUATION,*P_EQUATION,**PP_EQUATION;


//-------------------------------------------------
// 12 valeurs : (3 masses) * (position (x,y) + vitesse (vx,vy)) = (3)*(2+2) = 12
//-------------------------------------------------
#define INDEX_XA        0
#define INDEX_YA        1
#define INDEX_VXA       2
#define INDEX_VYA       3

#define INDEX_XB        4
#define INDEX_YB        5
#define INDEX_VXB       6
#define INDEX_VYB       7

#define INDEX_XC        8
#define INDEX_YC        9
#define INDEX_VXC       10
#define INDEX_VYC       11
//-------------------------------------------------
// 12 valeurs : (3 masses) * (vitesse (vx,vy) + acceleration (ax,ay)) = (3)*(2+2) = 12
//-------------------------------------------------
#define DINDEX_VXA       0
#define DINDEX_VYA       1
#define DINDEX_AXA       2
#define DINDEX_AYA       3

#define DINDEX_VXB       4
#define DINDEX_VYB       5
#define DINDEX_AXB       6
#define DINDEX_AYB       7

#define DINDEX_VXC       8
#define DINDEX_VYC       9
#define DINDEX_AXC       10
#define DINDEX_AYC       11

//-------------------------------------------------
// on cherche a resoudre Y'=f(X,Y)
// avec X un scalaire, et Y et Y' sont des vecteurs (12 dimensions) :
// Y = ( xA  )  Y' = ( vxA )  <-- masse A
//     ( yA  )       ( vyA )  
//     ( vxA )       ( axA )  
//     ( vyA )       ( ayA )  
//     ( xB  )       ( vxB )  <-- masse B
//     ( yB  )       ( vyB )  
//     ( vxB )       ( axB )  
//     ( vyB )       ( ayB )  
//     ( xC  )       ( vxC )  <-- masse C
//     ( yC  )       ( vyC )  
//     ( vxC )       ( axC )  
//     ( vyC )       ( ayC )  
// 
// ici dans cette fonction <res> est le vecteur Y' que l'on doit calculer
BOOL funcEquaDiff(P_VECTND res,double x,P_VECTND y,void *param)
{
P_EQUATION  eq;
double      FAB,FAC,FBC;              // les forces (en norme relative +/-)
double      lAB,lAC,lBC;              // les longueurs
double      angleAB,angleAC,angleBC;  // les angles des droites (AB), (AC), et (BC)
double      dxAB,dyAB;                // variables utiles (calcul des longueurs et des angles)
double      dxAC,dyAC;                // variables utiles (calcul des longueurs et des angles)
double      dxBC,dyBC;                // variables utiles (calcul des longueurs et des angles)

eq = (P_EQUATION)param;
AssertPointer(eq);

// le probleme des vitesses est trivial,
// puisque l'on nous les donne
res->coord[DINDEX_VXA] = y->coord[INDEX_VXA]; // masse A
res->coord[DINDEX_VYA] = y->coord[INDEX_VYA];
res->coord[DINDEX_VXB] = y->coord[INDEX_VXB]; // masse B
res->coord[DINDEX_VYB] = y->coord[INDEX_VYB];
res->coord[DINDEX_VXC] = y->coord[INDEX_VXC]; // masse C
res->coord[DINDEX_VYC] = y->coord[INDEX_VYC];

// passons aux choses serieuses, l'accelerations des masses
// est donnees par le PFD (principe fondamental de la dynamique)
// a=F/m, de plus on sait calculer F pour des ressorts : F = - k.(l-l0)

// * on calcule les longueurs
dxAB = y->coord[INDEX_XB] - y->coord[INDEX_XA]; // longueur entre A et B
dyAB = y->coord[INDEX_YB] - y->coord[INDEX_YA];
lAB  = sqrt(dxAB*dxAB + dyAB*dyAB);
dxAC = y->coord[INDEX_XC] - y->coord[INDEX_XA]; // longueur entre A et C
dyAC = y->coord[INDEX_YC] - y->coord[INDEX_YA];
lAC  = sqrt(dxAC*dxAC + dyAC*dyAC);
dxBC = y->coord[INDEX_XC] - y->coord[INDEX_XB]; // longueur entre B et C
dyBC = y->coord[INDEX_YC] - y->coord[INDEX_YB];
lBC  = sqrt(dxBC*dxBC + dyBC*dyBC);
// * on calcule les forces
FAB = - eq->rAB.k * (lAB - eq->rAB.l0);
FAC = - eq->rAC.k * (lAC - eq->rAC.l0);
FBC = - eq->rBC.k * (lBC - eq->rBC.l0);
// * on calcule les angles (sens trigonometrique)
angleAB = atan2(dyAB,dxAB);
angleAC = atan2(dyAC,dxAC);
angleBC = atan2(dyBC,dxBC);
// * on calcule les accelerations (attention aux signes)
res->coord[DINDEX_AXA] = ((- FAB*cos(angleAB) - FAC*cos(angleAC))/eq->mA) - eq->alpha*y->coord[INDEX_VXA]; // masse A
res->coord[DINDEX_AYA] = ((- FAB*sin(angleAB) - FAC*sin(angleAC))/eq->mA) - eq->alpha*y->coord[INDEX_VYA];
res->coord[DINDEX_AXB] = ((+ FAB*cos(angleAB) - FBC*cos(angleBC))/eq->mB) - eq->alpha*y->coord[INDEX_VXB]; // masse B
res->coord[DINDEX_AYB] = ((+ FAB*sin(angleAB) - FBC*sin(angleBC))/eq->mB) - eq->alpha*y->coord[INDEX_VYB];
res->coord[DINDEX_AXC] = ((+ FAC*cos(angleAC) + FBC*cos(angleBC))/eq->mC) - eq->alpha*y->coord[INDEX_VXC]; // masse C
res->coord[DINDEX_AYC] = ((+ FAC*sin(angleAC) + FBC*sin(angleBC))/eq->mC) - eq->alpha*y->coord[INDEX_VYC];

return TRUE;
} // funcEquaDiff()


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

06 août 2005 15:59:19 :
orthographe + coefficient de frottements
06 août 2005 16:04:02 :
screenshot
06 août 2005 16:04:27 :
screenshot

 Sources du même auteur

Source avec Zip Source avec une capture COLORATION SYNTAXIQUE
Source avec Zip Source avec une capture ORBITES DES SATELLITES GPS
Source avec Zip Source avec une capture DESSIN D'ARBRES
Source avec Zip Source avec une capture PROGRAMMATION LINEAIRE
Source avec Zip EXTENSION DE CORPS (MATH)

 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

 Sources en rapport avec celle ci

RESOLUTION D'UNE EQUATION DU SECOND DEGRÉ AVEC RACINES REEL... par maloum41
Source avec Zip TRANSFORMER UN ENTIER EN DEUX NOMBRES COMPOSÉ DES MEMES CHIF... par thebroyeur
CALCULER LE PRODUIT DE DEUX MATRICES DE TAILLE DIFFERENT par aymenet1
[C/C++] DÉTERMINER LES DIVISEURS D'UN NOMBRE AVEC DES INFORM... par soso62fr
Source avec Zip Source avec une capture MATH 2ND par ndubien

Commentaires et avis

Commentaire de skone007 le 06/08/2005 00:28:25

Merci regarder le moteur "http://www.cppfrance.com/code.aspx?ID=33024" sera bientôt a jour ... ;)

Commentaire de cosmobob le 06/08/2005 01:35:12

salut,
un détail: c'est pas un ressort plutot?

Commentaire de skone007 le 06/08/2005 01:54:03

SiSi mais y a un truc il manque plus qu'a ajouté un facteur d'attenuation pour que les ressorts ce calme et voilà :)

Commentaire de vecchio56 le 06/08/2005 10:06:43 administrateur CS

et ce facteur doit être plutot important, car moi je n'ai jamais vu des ressorts avec un tel comportement dans la réalité

Commentaire de skone007 le 06/08/2005 10:19:45

si on a 2 particules A et B

FA = -[Ks * (|L| - r) + Kd *(_L * L)/|L|]*(L/|L|)

l = a - b, r est la longuer au repos, ks constante du ressort, et kd constante d'attenuation. _L le derivé de L en fonction du temps, c'est juste va - vb, de la velocité des 2 particules.

Et aussi j'ai un peu de mal avec la manière dont ta coder ca ...

Mais je vais essayé de comprendre ...

Commentaire de luhtor le 06/08/2005 11:05:38

Normalement, tu dois pouvoir éviter d'utiliser la trigo pour ce genre de calcul. Quand tu projètes ton PFD, faut pas utiliser la forme trigo, mais le bon vieux x.x' + y.y'. Enfin c'est mon avis.

Commentaire de JCDjcd le 06/08/2005 11:21:02

OUPS effectivement c'est ressort ! je suis tout confu !

skone007 : c'est des frottements ou pas ? f=alpha.v ?

Commentaire de JCDjcd le 06/08/2005 16:06:16

j'ai pas tres bien compris a quoi servait les L/|L|=sign(L), donc j'ai mais une force de frottements en f=alpha*vitesse (vectoriellement)

Commentaire de skone007 le 06/08/2005 22:08:19

C'est un facteur d'attenuation c'est un formule que j'ai peché dans une doc de FEM ... :)

Commentaire de Kirua le 03/09/2005 03:36:12

voui, le facteur d'atténuation joue le même rôle que les frottements, ça a un nom dans ce cas si ... j'ai oublié évidemment, j'ai lu ça il y a longtemps, mais en gros en rajoute ça quand on fait des simulation de vêtements ou de corps mous avec des ressorts, ça n'a à mon avis rien à faire dans une simulation de physique ceci dit ^^.

Commentaire de Kirua le 03/09/2005 03:36:29

ce cas-ci *

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Cherche ecole programmation (pur) [ par Booster ] Bonjour à tous, Alors voila tout est dans le titre je cherche une école de programmation (Pas école d'ingénieur car je pense que je vais m'ennuyer, je derive math [ par jalal_yassine ] derive(ichtikak)bonsoirje suis un nouveau ici dans le forumbaah j'ai poser mon question ici puisque je sais qu'il a beaucoup des engenieurs ou des gen Moteur physique : détecter les collisions [ par noncommunique ] Bonjour !!Je suis en train de tenter de réaliser un moteur physique et j'ai le problème suivant : je ne sais pas comment faire pour détecter une évent cos et sin [ par unionx ] désolé pour le sendage ici onClipEvent (enterFrame) { incrementation+= 0.1; x = this._x+(Math.cos( incrementation)*15); y = this._y+(Math.s Résolution equation différentielle [ par samerkamal ] Bonjour,je cherche un algorithme pour résoudre une équation différentielle du premier ordre sous delphi.équation de type: df(t)/dt = 1/k (g(t) - f(t)) Problème Equation différentielle [ par abri34 ] Bonjour,je cherche un programme en C/C++ pour résoudre une équation de type: df(t)/dt = 1/k (g(t) - f(t)) avec g et f deux fonctions indépendantes et Math & info [ par fahdovski ] Bonjour et merci de me repondre. Comment faire pour reperer une ligne qui contient que des 1 ensuite la supprimer enfin decaler tout ce qu'il y'avai physique des matériaux [ par frereamir ] salut à tous, je voudrais savoir comment on importe des .dat de l'origine (logiciel de graphisme) vers c++et merci math calcul formel [ par yvessimon ] yvessimon fortran ou C? [ par fandestargate ] Voila, je dois faire un stage à mon universitée sur des problemes de physiques quantique et de physique statistique. Le but du stage sera de créer un


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,905 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales