Resolution d'une equation speciale

Résolu
un4given Messages postés 42 Date d'inscription dimanche 14 novembre 2004 Statut Membre Dernière intervention 19 juillet 2006 - 1 avril 2005 à 17:44
un4given Messages postés 42 Date d'inscription dimanche 14 novembre 2004 Statut Membre Dernière intervention 19 juillet 2006 - 8 avril 2005 à 15:44
Bonjour a tous !!
Bon je réalise en ce moment un jeu de tir a l'arc en 3D dans le cadre de mes cours (des que le prog est fini je le mettrai sur le site, ca pourra toujours servir a d'autres...), et j'ai besoin a un moment donné de resoudre une equation du type :
A = Bt - Cexp(Dt)

Ici A, B, C, D sont des constantes connues, la variable est t. (exp() c pour exponentielle des fois que je mets pas les bonnes notations ! ;o) )

Voila donc je ne sais pas resoudre ca manuellement... donc je sais encore moins le programmer !!!! Donc une petite aide me sera fort sympathique !!

Merci !

20 réponses

dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
2 avril 2005 à 20:24
Oui de puis que luhtor m'a fit decouvrir la fct rdtsc() je l'utlise tt le tps ! et elle est vachement precise en plus!
Et je confirme elle fonctionne sur amd
3
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
1 avril 2005 à 20:37
Tu peux essayer de resoudre l'equation:

Cexp(Dt) - Bt +A =0 par dichotomie

Le plus dur est de trouver un encadrement de ou la fonction s'annule...mais je ne vois pas comment pour l'instant...

Une fois trouvé l'encadrement du changement de signe de la fonction, tu prends le milieu de cet encadrement.
Par exmple au depart tu as :

a < f(t) < b

ensuite tu fais l'etude de signe de f(t) sur [a , (a+b)/2] si la focntion change de signe sur cet intervalle tu garde cet intervalle sinon tu garde l'autre puis tu le recoupe en 2 jusqu'a atteindre la precision voulue
0
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
1 avril 2005 à 20:41
et pour savoir si la fonction chane de signe sur un intervalle c'est tres simple :

si les signe des bornes de l'intervalle sont differents alors la fonction change de signe sinon elle reste soit negative ou + . Bien sur il faut que la focntion s'annule qu'une fois sur cet intervalle...

Donc au depart prend un intervalle tres grossier puis tu devrais converger tres rapidement vers la solution en le divisant par 2

bonne chance!
0
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
1 avril 2005 à 21:37
En voulant aller trop vite j'ai fais une erreur grossiere !

Je reprends ce que j'ai dit en 2

"si les signes des'images des bornes de l'intervalle par la fonction sont differents alors..."

au lieu de "si les signe des bornes de l'intervalle sont differents alors "
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
minet03 Messages postés 415 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 2 décembre 2005 3
1 avril 2005 à 21:57
Ca dépend ce que tu appel résoudre. Cette équation peut servir à plein de choses. tu veux calculé quoi avec cette équation ? t ?

Le CyberMonde nous offre une meilleur qualité de vie
CyberMan.inc The WebSite
0
minet03 Messages postés 415 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 2 décembre 2005 3
1 avril 2005 à 22:01
oups j'suis allé trop vite pour le poste.

Si tu veux t, il faut commencer comme la si bien dit dletozeun.
Cexp(Dt) - Bt + A = 0 ensuite tu fais la dérivé pour le sens de
variation. Vu que la fonction est continu ( fonction exponentielle ) tu
peux faire un théorème des valeurs intermédiaires. Ce qui te donne la
valeur (approché) de t pour résoudre l'équation.

Le CyberMonde nous offre une meilleur qualité de vie
CyberMan.inc The WebSite
0
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
1 avril 2005 à 22:22
Oui minet03 , le tableau de variation lui permettra de voir sur quels intervalles la fonction s'annule
0
minet03 Messages postés 415 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 2 décembre 2005 3
2 avril 2005 à 09:45
Et donc évité de divisé par 2 pour obtenir l'intervalle. gain de temps

Le CyberMonde nous offre une meilleur qualité de vie
CyberMan.inc The WebSite
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
2 avril 2005 à 10:05
Moi je me demande pourquoi as tu besoin de résoudre une telle équation pour ton jeu. Tu peux préciser ?
0
un4given Messages postés 42 Date d'inscription dimanche 14 novembre 2004 Statut Membre Dernière intervention 19 juillet 2006
2 avril 2005 à 12:23
Bon deja merci a tous pour vos reponses !

Alors je commence par la methode par dichotomie proposée... En fait le probleme c'est que mes constantes A, B, C et D dependent de chaque partie, puisque par exemple C depend des conditions de vent, des differentes conditions de tirs etc... Donc il faudrait carrement programmer ce systeme de resolution et je doute d'avoir les competences mathematiques pour en assurer des resultats justes quelques soit les conditions (ben oui j'ai beau faire des etudes scientifique a fond j'ai toujours été une certaine quiche ne maths !!!! ;o) ).

Bon mais luthor a posé une bonne question, je vais vous expliquer pourquoi j'en ai besoin car peut etre qu'une methode plus simpliste existe pour resoudre mon probleme.

En fait actuellement je programme une fonction qui va me calculer le temps t auquel la fleche s'arrete. Pour cela je suis parti dans un algorythme de ce type :

1) on calcule la valeur de t pour laquelle la fleche a pour coordonnée z = 0 (touche le sol).
2) on regarde si pour cette valeur de t, la trajectoire selon y (distance) a dépassé ou non la distance a laquelle le blason a été situé.
3) Si ca n'a pas été atteind alors on définit le temps trouvé comme étant le temps final.
4) Si le blason a été dépassé, alors on calcule le temps t_y auquel la fleche a atteind pile a valeur y = distanceBlason. (je ne l'ai pas fait des le depart car vu qu'il est possible que cette distance ne soit pas atteinte je risquais de créer des erreurs...)
5) Pour cette valeur de t trouvé, on regarde si les conditions selon x et z permettent de trouver que la fleche se situe dans la cible ou non (ca c'est facile)
6) Si on est dans la cible alors on définit le t_y comme etant le t final, sinon on recupere le premier t comme t final.

Voila j'espere avoir été clair... c'est pas sur !!! Donc mon equation casse bonbon intervient en fait deux fois, a l'etape 1 et 4... Et si elle est un peu compliquée c'est parce que la modelisation physique de la trajectoire de la fleche selon les 3 axes a été faite sans négliger bcp de choses (on doit tenir compte de la masse de la fleche, du rendement de l'arc, de la resistance de l'air, du vent etc...).

Si vous pouvez encore m'aider...
0
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
2 avril 2005 à 13:22
oula ca a l'air vachement compliqué....
Et plutot que de resoudre bcp d'equation comme celle la tu pourrais pas utiliser l'approximation d'euler ? ca serait bcp plus simple...
0
un4given Messages postés 42 Date d'inscription dimanche 14 novembre 2004 Statut Membre Dernière intervention 19 juillet 2006
2 avril 2005 à 13:34
Heu ben moi je veux bien l'utiliser l'approximation d'Euler mais je vois pas de quoi tu parles...

Si tu pouvais me dire de quoi il s'agit precisemment et comment tu penses qu'il serait utile de l'utiliser ici... Merci !
0
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
2 avril 2005 à 18:58
ah...ben je veux bien te faire un petit cours de math sur l'approx d'euler !

c'est pas tres compliqué :

Prenons ta fleche, le bilan des forces de facon simplifié donne:
_le poids de la fleche P
_les frottments f
_la force du vent V

d'apres le PFD on a : P + f + V = m.a ( P,f et V vecteurs) et a l'acceleration de la fleche et m sa masse

avec ca tu calcule a chaque instant l'acceleration de la fleche que tu considere constante durant cet instant dt
en suite a partir de l'acceleration a tu calcule la vitesse par l'approx d'euler qui donne :

v ( t+dt) =a.dt + v (t)

ici tu calcul la vitesse nouvelle apres une durée dt considéré elementaire
tu multiplie a par dt pour obtenir une vitesse et tu lui ajoute la vitesse precedente de la fleche a l'instant t

En fait c'est comme si tu considerais l'acceleration constante pendant cet instant dt
et en multipliant a par dt tu calcule en fait la vitesse que gagne ou perd la fleche suivant le signe de a.

En ce qui concerne la position de la fleche et bien tu reintegre tout ca !

x (t+dt) = 0.5*a.dt² +v(t+dt).dt + x(t)

On voit alors que plus on prendra un petite valeur pour l'instant elementaire dt plus on obtiendra une trajectoire precise.
Mais si cette valeur est trop petite ca risque d'etre tres lent !
Si elle est trop grande on risque de s'eloigné enormement de la trajectoire reelle !
Il faut trouver le juste milieu

voila! j'espre avoir ete assez clair ! En passant tu est en quel classe ?
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
2 avril 2005 à 19:34
dletozeun t'a expliqué. En gros il faut que tu insères dans ta boucle
d'affichage openGL (tu fais de l'openGL ?, ca n'a pas d'importance de
toute facon), une séquence de ce type:

Ta flèche est repéré par les coordonnées: x,y,z , la vitesse par vx, vy, vz et l'accélération par az, ay, az;



Dès que l'utilisateur lance la flèche, tu mets dans vx, vy, vz la
vitesse initiale de la flèche ainsi que dans x,y,z la position au
moment ou on la lance.



time_frame = heure du pc en millième de seconde voir mieux.



while ((z >= 0 en gros ta flèche est encore en lair) ou (ta flèche n'a pas depassé la cible))

{

time_frame = heure du pc en millième de seconde - time_frame;



ax = la force du vent suivant x + frottement de l'air (exemple: -k*vx);

ay = la force du vent suivant y + frottement de l'air (exemple: -k*vy);

az = la force du vent suivant z + le poids de ta flèche + frottement de l'air (exemple: -k*vz);



ici k désigne une constante de frottement que tu mets au hasard dans un
premier temps et tu la régleras apres, mais plutot assez fort genre k =
0.5 par exemple.



vx = vx + ax * time_frame;

vy = vy + ay * time_frame;

vz = vz + az * time_frame;



x = x + vx * time_frame;

y = y + vy * time_frame;

z = z + vz * time_frame;



voila, x, y, z contiennent les coordonnées de la flèche, tu as plus qu'a l'afficher.



}



Voila, c'est une méthode efficace pour ce que tu veux. Moi je l'aime bien.

Pour la fonction de l'heure en millième de seconde, si tu trouves voici ma solution:

Moi j'utilise la nombre de cycle d'horloge depuis que ton pc est allumé:



extern __inline__ unsigned long long int rdtsc() // Cette fonction n'est pas de moi ^^ malheureusement


{
// mais de tutoriels

unsigned long long int x;

__asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));

return x;

}



Normalement elle est faite pour pentium (elle n'est pas de moi), mais elle semble marcher aussi sur amd.

Donc maintenant, pour revenir a time_frame, ca devient:



time_frame = rdtsc();



while ...

{

time_frame = rdtsc() - time_frame;

time_frame /= la fréquence de ton processeur en Hertz (attention ! en hertz)



...



}



J'espère que tu comprendras ce que j'ai écris, car ca marche très bien ++
0
un4given Messages postés 42 Date d'inscription dimanche 14 novembre 2004 Statut Membre Dernière intervention 19 juillet 2006
2 avril 2005 à 21:23
Bon ben merci pour toutes ces aides je devrais pouvoir m'en sortir maintenant !!

Sinon pour l'approx d'Euler autant pour moi je connais tres bien la methode mais elle m'etait completement sortie de la tete !!!!

A part ca pour les deux ptites questions, je suis en ecole d'ingé (electrotech, pas maths ni info d'ou mes quelques lacunes... ) et je programme pas encore sous openGL. En fait pour le moment je realise tout le modele physique puis les menus ou l'utilisateur va entrer les differentes caractéristiques etc. Normalement je devrais avoir tout fini ces details en debut de semaine si j'ai le temps de bosser dessus. Puis apres par contre je vais passer en openGL pour la 3D mais la ca va etre marrant car je ne connais rien a l'openGL m'enfin...

D'ailleurs question annexe et facultative : pour mes differents menus, je les programme sous fenetre dos (ben oui c'est moche mais c'est facile pour les debutants !). Est il possible sans trop modifier le code principal de les passer sous API windows, ou mieux ? Si oui comment faire ???
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
2 avril 2005 à 21:49
Hm personnellement j'y connais rien en API. Moi je te conseil de ne pas
utiliser des API windows, mais des librairies portables genre GTK (pour
que ton log puisse etre compilé sous autre chose que windows). Sinon tu
devrais te mettre à openGL, c'est vraiment pas très compliqué et tu
pourrais faire des menus avec, ca serait plus beau.



Ceci dit, c'est vrai que pour le moment tu peux te contenter de menus
dos. Par contre quand tu attaqueras le graphisme, utilise openGL.



Pour le comportement physique, tu devrais compliquer un peu le truc en
gérant différente parties de la flèche, pour compléxifier le
comportement et le rendre plus réaliste.
0
un4given Messages postés 42 Date d'inscription dimanche 14 novembre 2004 Statut Membre Dernière intervention 19 juillet 2006
3 avril 2005 à 00:14
Oui l'openGL c'estr sur je vais m'y mettre au moins pour le graphisme. Apres pour y incorporer les menus etc. je n'ai aucune aide dessus donc ca va etre dur, mais si tu connais de bonnes sources exemples, ou bien un bon tuto simple d'acces pour les novices alors je suis preneur.

Sinon pour le modele physique, il est deja assez complet actuellement, mais je le "peaufinerai" une fois que j'aurais deja pu le tester avec le programme complet.
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
3 avril 2005 à 01:09
Personnellement comme je compte pas tjs programmer sous windows,
j'utiliserais GTK, que j'ai deja testé. Ca te permet d'avoir une
interface portative a la windows.

http://www.linux-kheops.com/doc/cours/config.php?ptd=gtk-tutorial/index.html



voici un tutoriel. Mais bon, j'y connais pas grand chose dans ces domaines. Je fini ma prepa, et je verrais ca après :)
0
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
7 avril 2005 à 20:46
C'est fou ce qu'on perd quand on est en ecole d'ingé !
Et t'es dans quelle ecole si c'est pas indiscret ?
0
un4given Messages postés 42 Date d'inscription dimanche 14 novembre 2004 Statut Membre Dernière intervention 19 juillet 2006
8 avril 2005 à 15:44
a l'Ensieg, une ecole de l'INPG.... et oui on perd beaucoup de temps a faire des projets pas forcemment des plus interressants...
0
Rejoignez-nous