Accueil > > > RESSORTS
RESSORTS
Information sur la source
Description
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()
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
Sources de la même categorie
Commentaires et avis
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
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
RE : SAC A DOS RE : SAC A DOS par hadjkaddour
Cliquez pour lire la suite par hadjkaddour
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|