Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

RÉSOLUTION NUMERIQUE


Information sur la source

Catégorie :Maths & Algorithmes Classé sous : simulation, physique, numérique, differentielle, 3d Niveau : Débutant Date de création : 24/03/2008 Date de mise à jour : 27/03/2008 18:21:27 Vu / téléchargé: 4 582 / 178

Note :
Aucune note

Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
Il s'agit d'une source permettant de résoudre numériquement les systèmes de type df(x, y, z, t)/dt = g(x, y, z, t)/dt.
Contrairement à d'autre source ici je n'utilise pas tel ou tel méthode d'intégration mais j'ai implémenté plusieurs méthodes et c'est à l'utilisateur de choisir laquelle il veut utiliser.
J'ai implémenté :
Euler Implicite
Euler Explicite
Euler Cauchy Explicite
Adams Boford Molton Explicite t Implicite d'ordre 2, 3 et 4
Gear Implicite d'ordre 2, 3 et 4
Runge Kutta Explicite d'ordre 2, 4 et 6
Runge Kutta implicite d'ordre 3
Euler Ameliorer Explicite
Crank Nicholson Explicite

En gros j'ai fait une interface Integrator et les méthodes sont des enfants de cette interface.

L'image montre un exemple de visualisation avec glut de l'attracteur de Lorentz...
 

Source

  • #include <iostream>
  • #include <list>
  • #include <GL/gl.h>
  • #include <GL/glu.h>
  • #include <GL/glut.h>
  • #include "Vector3D.h"
  • #include "Integrator.h"
  • #include "NS_Euler_I.h"
  • using namespace std;
  • using namespace eMV;
  • Vector3D<float> Henon(const Vector3D<float> &v, const float t)
  • {
  • return Vector3D<float>( v.y + 1 - 1.4*v.x*v.x,
  • 0.3*v.x,
  • 0);
  • }
  • Vector3D<float> Lorentz(const Vector3D<float> &v, const float t)
  • {
  • return Vector3D<float>( 10*(v.y - v.x),
  • 28*v.x - v.y - v.x*v.z,
  • v.x*v.y - 8/3*v.z);
  • }
  • fIntegrator *euler = new fNS_Euler_I(Lorentz, fVector3D(0.1, 0.1, 0.1), 0, 0.003);
  • list<fVector3D> data;
  • void init(void)
  • {
  • glShadeModel(GL_SMOOTH); // Enables Smooth Color Shading
  • glClearDepth(1.0); // Depth Buffer Setup
  • glEnable(GL_DEPTH_TEST); // Enable Depth Buffer
  • glDepthFunc(GL_LESS); // The Type Of Depth Test To Do
  • glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
  • }
  • void display(void)
  • {
  • fVector3D v;
  • glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  • glColor3f (1.0, 1.0, 1.0);
  • glLoadIdentity (); // clear the matrix
  • // viewing transformation
  • gluLookAt (50.0, 50.0, 50.0, 0.1, 0.1, 20.0, 1.0, 0.0, 0.0);
  • //
  • glBegin(GL_LINES);
  • glColor3ub(255, 0, 0);
  • glVertex3f(0, 0, 0);
  • glVertex3f(1, 0, 0);
  • glColor3ub(0, 255, 0);
  • glVertex3f(0, 0, 0);
  • glVertex3f(0, 1, 0);
  • glColor3ub(0, 0, 255);
  • glVertex3f(0, 0, 0);
  • glVertex3f(0, 0, 1);
  • glEnd();
  • data.push_back(euler->F);
  • euler->next();
  • //cout << euler->F << endl;
  • glBegin(GL_LINE_STRIP);
  • list<fVector3D>::iterator it;
  • for (it = data.begin(); it != data.end(); ++it)
  • {
  • glColor3ub(255, 128, 0);
  • glVertex3f((*it).x, (*it).y, (*it).z);
  • }
  • glEnd();
  • //
  • glFlush ();
  • }
  • void reshape (int w, int h)
  • {
  • glViewport(0, 0, (GLint)w, (GLint)h);
  • glMatrixMode(GL_PROJECTION);
  • glLoadIdentity();
  • gluPerspective(45.0, (float)w/(float)h, 0.1, 100.0);
  • glMatrixMode(GL_MODELVIEW);
  • glLoadIdentity();
  • }
  • void keyboard(unsigned char key, int x, int y)
  • {
  • switch (key)
  • {
  • case 27 :
  • exit(0);
  • break;
  • default :
  • glutPostRedisplay();
  • }
  • }
  • int main(int argc, char **argv)
  • {
  • try
  • {
  • glutInit(&argc, argv);
  • glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
  • glutInitWindowSize (500, 500);
  • glutInitWindowPosition (100, 100);
  • glutCreateWindow (argv[0]);
  • init ();
  • glutDisplayFunc(display);
  • glutReshapeFunc(reshape);
  • glutKeyboardFunc(keyboard);
  • glutMainLoop();
  • delete euler;
  • return 0;
  • }
  • catch(std::exception& e)
  • {
  • cout << e.what() << endl;
  • }
  • catch(Error &e)
  • {
  • cout << e.GetMessage() << endl;
  • }
  • return 0;
  • }
#include <iostream>
#include <list>

#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>

#include "Vector3D.h"

#include "Integrator.h"
#include "NS_Euler_I.h"

using namespace std;
using namespace eMV;

Vector3D<float> Henon(const Vector3D<float> &v, const float t)
{
	return Vector3D<float>(	v.y + 1 - 1.4*v.x*v.x,
							0.3*v.x,
							0);
}

Vector3D<float> Lorentz(const Vector3D<float> &v, const float t)
{
	return Vector3D<float>(	10*(v.y - v.x),
							28*v.x - v.y - v.x*v.z,
							v.x*v.y - 8/3*v.z);
}

fIntegrator *euler = new fNS_Euler_I(Lorentz, fVector3D(0.1, 0.1, 0.1), 0, 0.003);
list<fVector3D> data;

void init(void)
{
	glShadeModel(GL_SMOOTH);                 // Enables Smooth Color Shading
	glClearDepth(1.0);                       // Depth Buffer Setup
	glEnable(GL_DEPTH_TEST);                 // Enable Depth Buffer
	glDepthFunc(GL_LESS);		           // The Type Of Depth Test To Do
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}

void display(void)
{
	fVector3D v;
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glColor3f (1.0, 1.0, 1.0);
	glLoadIdentity (); // clear the matrix
	// viewing transformation
	gluLookAt (50.0, 50.0, 50.0, 0.1, 0.1, 20.0, 1.0, 0.0, 0.0);
	//
	glBegin(GL_LINES);
		glColor3ub(255, 0, 0);
		glVertex3f(0, 0, 0);
		glVertex3f(1, 0, 0);
		glColor3ub(0, 255, 0);
		glVertex3f(0, 0, 0);
		glVertex3f(0, 1, 0);
		glColor3ub(0, 0, 255);
		glVertex3f(0, 0, 0);
		glVertex3f(0, 0, 1);
	glEnd();
	data.push_back(euler->F);
	euler->next();
	//cout << euler->F << endl;
	glBegin(GL_LINE_STRIP);
	list<fVector3D>::iterator it;
	for (it = data.begin(); it != data.end(); ++it)
	{
		glColor3ub(255, 128, 0);
		glVertex3f((*it).x, (*it).y, (*it).z);
	}
	glEnd();
	//
	glFlush ();
}

void reshape (int w, int h)
{
	glViewport(0, 0, (GLint)w, (GLint)h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(45.0, (float)w/(float)h, 0.1, 100.0);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

void keyboard(unsigned char key, int x, int y)
{
	switch (key)
	{
		case 27 :
				exit(0);
			break;
		default :
			glutPostRedisplay();
	}
}

int main(int argc, char **argv)
{
	try
	{
		glutInit(&argc, argv);
		glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
		glutInitWindowSize (500, 500);
		glutInitWindowPosition (100, 100);
		glutCreateWindow (argv[0]);
		init ();
		glutDisplayFunc(display);
		glutReshapeFunc(reshape);
		glutKeyboardFunc(keyboard);
		glutMainLoop();
		delete euler;
		return 0;
	}
	catch(std::exception& e)
	{
		cout << e.what() << endl;
	}
	catch(Error &e)
	{
		cout << e.GetMessage() << endl;
	}
	return 0;
}

Conclusion

Le but est de crée un moteur physique. Pas un moteur pour les jeux vidéos en temps réel mais un moteur de simulation physique. Ces méthodes de résolution servirons de base à la suite pour la simulation Physique. La prochaine fois j'implémenterais la gestion des corps indéformables déformable et les fluides.
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

24 mars 2008 23:19:16 :
ajout de screen
27 mars 2008 18:21:29 :
Ajout d'un exemple utilisant l'API. Attracteur de Lorentz

Commentaires et avis

signaler à un administrateur
Commentaire de skone007 le 26/03/2008 22:22:21

Ah l'intégration numérique n'intéresse personne... Ah la physique et l'analyse numérique quand tu nous tiens.

signaler à un administrateur
Commentaire de Xs le 27/03/2008 15:24:04

Salut,

Ta source a l'air vraiment très bien, et elle m'intéresse beaucoup (comme toi, je suis un mordu de maths et simulation numérique).

Mais pourrais-tu fournir un code (et exe peut-être) utilisant ta librairie ? Genre le code-source de l'exemple dont tu présentes une capture d'écran ? Je t'en serais reconnaissant, et ça me permettrais de mieux voir comment ton code fonctionne.

Encore bravo.

Cordialement

signaler à un administrateur
Commentaire de Xs le 27/03/2008 20:24:05

Merci pour l'exemple, je vais tester ton code dès à présent.

Cordialement

signaler à un administrateur
Commentaire de hida16 le 08/06/2009 17:12:24

c génial ton code moi j'essaye de le faire avec une seule méthode mais pour lorentz ,hennon et chua ,si tu peut m'aider ce ne sera pas de refu ,tout mes  encouragements ,bravo.
  

signaler à un administrateur
Commentaire de skone007 le 08/06/2009 21:05:29

Je veux bien t'aider mais comment ?

signaler à un administrateur
Commentaire de hida16 le 09/06/2009 19:33:01

salut,alors tu peut m'aider en me montrons comment je peut modifier ton programme en java !!merci d'avance

signaler à un administrateur
Commentaire de skone007 le 10/06/2009 11:14:50

regarde ici http://www.google.fr/search?q=Convertisseur+C%2B%2B+java&ie=utf-8&oe=utf-8

signaler à un administrateur
Commentaire de hida16 le 10/06/2009 19:11:38

merciiiiiiiiiiiiiii

signaler à un administrateur
Commentaire de hida16 le 23/06/2009 18:35:34

ça ne marche pas malheuresement!!!!

signaler à un administrateur
Commentaire de skone007 le 23/06/2009 18:53:36

Il faut réécrire les fonctions d'affichage avec les fonctions JAVA.
Sinon on comprend pas vraiment les choses de cette manière. Si ton but et d'utiliser un solveur numérique il faut utiliser des softs du genre FreeFEM, SicLba, ... Sinon convertir un code n'est pas la bonne méthode pour comprendre.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Création d'un moteur physique pour un avion (3d) | comment calculer certaines forces [ par daneel17fr ] Bonjour,donc je voudrai développer un moteur 3d pour simuler le comportement d'un avion en l'air.il n'est pas (encore) question d'affichage 3d, mais j Maillage d'objet en 3D - Help !!!!!!!!!!!!!!!!!!!!!!! [ par PhenixSly ] Je dois programmer un maillage d'objets en 3D pour mes études, mais je n'y arrive pas vraiment. Est-ce qu'une âme généreuse comme il n'en existe plus Win32 simulation de touche du clavier [ par zibo3 ] Bonjour, j'ai un petit souci, j'aimerai pouvoir simuler l'appuie sur la touche TAB mais avec la touche SHIFT appuyé.Je sais que je dois envoyé un évén aidez moi à faire une simulation graphique des .. [ par fadi82 ] Bjrs ,j'ai une simulation graphique à faire sur les portes logiques AND ,INV ,OR ,XOR ..si vous peuvez m'aider ça sera tres gentille de votre part .me 3D ENGINE [ par xarier ] SALUT VOILA j'ai deux question la premiere c comment realiser un moteur 3d c vous avez des cours c simpa et surtot avec opengl 2eme question est ce qu ca existe un moteur 3d directx en C et pas C++? [ par yerick ] j'ai beau cherché je ne trouve pas.meme pas une petite librairie.ya pas quelqu'un qui pourrait pondre un petit moteur 3d (meme tres simple) qui utilis simulation work bunsh reduit [ par fadi82 ] bjr ,j'ai un programme à faire en graphique semblable au logiciel electronique :work bunsh mais d'une façon reduite c-a-d juste les circuits de base A Physique [ par nemmezis ] Salut tout le monde,Voilà je suis en train de développer un petit moteur de FPS, et j'en suis en ce moment à la collision. Ca c'est fait. Maintenant, Existe-t-il un moyen de changer les fonctions des touches du pavé numérique? [ par Buzu ] Est-il possible de faire en sorte que lorsque j'appuie sur la touche '-' du pavé numérique, ce que j'ai tapé avant s'efface comme si j'avai fair 'reto Changer la configuration des touches du pavé numérique [ par Buzu ] Y a-t-il un moyen de changer le code ascii renvoyé par le touche '-' du pavé num pour que ce soit le mm que celui de la touche 'retour'?(soit dans le


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



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
Temps d'éxécution de la page : 0,406 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.