Résolution numerique

Soyez le premier à donner votre avis sur cette source.

Vue 10 328 fois - Téléchargée 634 fois

Description

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 / Exemple :


#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.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

skone007
Messages postés
166
Date d'inscription
mercredi 24 avril 2002
Statut
Membre
Dernière intervention
23 juin 2009
-
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.
hida16
Messages postés
11
Date d'inscription
samedi 6 juin 2009
Statut
Membre
Dernière intervention
14 mars 2011
-
ça ne marche pas malheuresement!!!!
hida16
Messages postés
11
Date d'inscription
samedi 6 juin 2009
Statut
Membre
Dernière intervention
14 mars 2011
-
merciiiiiiiiiiiiiii
skone007
Messages postés
166
Date d'inscription
mercredi 24 avril 2002
Statut
Membre
Dernière intervention
23 juin 2009
-
hida16
Messages postés
11
Date d'inscription
samedi 6 juin 2009
Statut
Membre
Dernière intervention
14 mars 2011
-
salut,alors tu peut m'aider en me montrons comment je peut modifier ton programme en java !!merci d'avance

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.