Intégrer un système d'équations différentielles

Tout ce qui concerne l'utilisation ou l'installation d'Asymptote.

Modérateur: gdm_asy

Règles du forum
Merci d'éviter le style SMS dans vos messages et de penser à utiliser la fonction Recherche avant de poster un message. Pour joindre des fichiers à vos messages, consulter ce sujet.
> Penser à utiliser les balises Code pour poster du code.

Intégrer un système d'équations différentielles

Messagepar cjorssen » Vendredi 11 Mars 2011, 22:34

Bonsoir à tous,

Je ne comprends pas bien la syntaxe de cette fonction (non documentée) de ode.asy.

Code: Tout sélectionner
// Integrate a set of equations, dy/dt=f(t,y), from a to b using initial
// conditions y, specifying either the step size h or the number of steps n.
Solution integrate(real[] y, real[] f(real t, real[] y), real a, real b=a,
                   real h=0, int n=0, bool dynamic=false,
                   real tolmin=0, real tolmax=0, real dtmin=0,
                   real dtmax=realMax, RKTableau tableau, bool verbose=false)


Quelqu'un aurait un exemple ? Je cherche à tracer les solutions d'un système de la forme $\left\{\begin{array}{ccc} \frac{dx}{dt} & = & \frac{E_x[x(t),y(t)]}{E[x(t),y(t)]} \\ \frac{dy}{dt} & = & \frac{E_y[x(t),y(t)]}{E[x(t),y(t)]} \end{array}\right.$.

Merci d'avance

--
Christophe
cjorssen
Déca-utilisateur
 
Messages: 49
Inscription: Jeudi 05 Novembre 2009, 15:08
Statut actuel: Actif et salarié | Enseignant

Publicité

Re: Intégrer un système d'équations différentielles

Messagepar GMaths » Vendredi 11 Mars 2011, 22:49

cjorssen a écrit:Je ne comprends pas bien la syntaxe de cette fonction (non documentée) de ode.asy.

Code: Tout sélectionner
// Integrate a set of equations, dy/dt=f(t,y), from a to b using initial
// conditions y, specifying either the step size h or the number of steps n.
Solution integrate(real[] y, real[] f(real t, real[] y), real a, real b=a,
                   real h=0, int n=0, bool dynamic=false,
                   real tolmin=0, real tolmax=0, real dtmin=0,
                   real dtmax=realMax, RKTableau tableau, bool verbose=false)


On l'a évoquée ici : http://forum.mathematex.net/asymptote-f34/portrait-de-phase-3d-d-un-pendule-t12127.html#p117186
il y a quelques mois.
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: Intégrer un système d'équations différentielles

Messagepar cjorssen » Vendredi 11 Mars 2011, 22:54

Bonsoir et merci de ta réponse.



C'est justement ce que j'ai relu avant de poser la question. Mais j'ai eu l'impression que ce n'était pas un système d'équations... Il faut que je relise tout ça (mieux).

Merci

--
Christophe
cjorssen
Déca-utilisateur
 
Messages: 49
Inscription: Jeudi 05 Novembre 2009, 15:08
Statut actuel: Actif et salarié | Enseignant

Re: Intégrer un système d'équations différentielles

Messagepar GMaths » Samedi 12 Mars 2011, 09:10

cjorssen a écrit:Je cherche à tracer les solutions d'un système de la forme $\left\{\begin{array}{ccc} \frac{dx}{dt} & = & \frac{E_x[x(t),y(t)]}{E[x(t),y(t)]} \\ \frac{dy}{dt} & = & \frac{E_y[x(t),y(t)]}{E[x(t),y(t)]} \end{array}\right.$.

Est-il possible d'avoir des précisions sur ce que signifient $E_x[x(t),y(t)]$, $E_y[x(t),y(t)]$ et $E[x(t),y(t)]$ ?
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: Intégrer un système d'équations différentielles

Messagepar cjorssen » Lundi 14 Mars 2011, 12:00

GMaths a écrit:On l'a évoquée ici : asymptote-f34/portrait-de-phase-3d-d-un-pendule-t12127.html#p117186
il y a quelques mois.


Effectivement, en relisant, j'ai compris...


GMaths a écrit:
cjorssen a écrit:Je cherche à tracer les solutions d'un système de la forme $\left\{\begin{array}{ccc} \frac{dx}{dt} & = & \frac{E_x[x(t),y(t)]}{E[x(t),y(t)]} \\ \frac{dy}{dt} & = & \frac{E_y[x(t),y(t)]}{E[x(t),y(t)]} \end{array}\right.$.

Est-il possible d'avoir des précisions sur ce que signifient $E_x[x(t),y(t)]$, $E_y[x(t),y(t)]$ et $E[x(t),y(t)]$ ?


Ce sont des fonctions assez horribles qui s'expriment avec des intégrales elliptiques. Je suis en train de voir ce que je peux faire avec gsl. Sinon $E^2 = E_x^2 + E_y^2$.

Le fond du problème est de tracer les lignes de champ du champ électrostatique créé par une spire uniformément chargée placée dans le plan $(O,\vec{e_x},\vec{e_z}$). On a : $Ex(x,y) = \int_0^{2\pi} \frac{x-\cos(\theta)}{((x-\cos(\theta))^2+\sin(\theta)^2+y^2)^{(3/2)}}d \theta$ et $E_y(x,y) = \int_0^{2\pi} \frac{y}{((x-\cos(\theta))^2+\sin(\theta)^2+z^2)^{(3/2)}}d \theta$.

Je vous tiens au courant si j'obtiens quelque chose de potable.

--
Christophe
cjorssen
Déca-utilisateur
 
Messages: 49
Inscription: Jeudi 05 Novembre 2009, 15:08
Statut actuel: Actif et salarié | Enseignant

Re: Intégrer un système d'équations différentielles

Messagepar cjorssen » Lundi 14 Mars 2011, 13:02

Voilà un premier jet. Les expressions de Ex et Ez (noter le changement de y en z par rapport au précédent message) ont été obtenues grâce à Maple (notons au passage que la définition des intégrales elliptiques dans Maple et dans gsl diffèrent un peu).

Code: Tout sélectionner
import ode;
import gsl;
import graph;
size(8cm,8cm,IgnoreAspect);

// diff(y[0]) = Ex(y[0],y[1])/sqrt(Ex^2 + Ez^2)
// diff(y[1]) = Ez(y[0],y[1])/sqrt(Ex^2 + Ez^2)
real Ex(real x, real z) {
  real sqrt_aux = 2 * sqrt(x/(x^2 + 2*x + 1 + z^2));
  return 2*(x^2*E(asin(1),sqrt_aux) + F(asin(1),sqrt_aux)*x^2 -
       2*F(asin(1),sqrt_aux)*x + F(asin(1),sqrt_aux) +
       F(asin(1),sqrt_aux)*z^2 - E(asin(1),sqrt_aux) -
       E(asin(1),sqrt_aux)*z^2) *
    ((z^2-2*x+x^2+1)/(x^2+2*x+1+z^2))^(1/2)/(z^2-2*x+x^2+1)^(3/2)/x;}
 
real Ez(real x, real z) {
  return 4 * E(asin(1),2*(x/(x^2+2*x+1+z^2))^(1/2)) *
    ((z^2-2*x+x^2+1)/(x^2+2*x+1+z^2))^(1/2)*z/(z^2-2*x+x^2+1)^(3/2);}

real[] sys(real t, real[] y) {
  // Renvoie les seconds membres
  real ex = Ex(y[0],y[1]);
  real ez = Ez(y[0],y[1]);
  real e = sqrt(ex^2 + ez^2);
  return new real[] {ex/e,ez/e};}
 
Solution sol=integrate(y=new real[] {0.05,0.05},
             sys,a=0,b=3,n=100,
             dynamic=true,tolmax=0.0001,RK4,verbose=true);

guide courbe=graph(transpose(sol.y)[0],transpose(sol.y)[1]);

draw(courbe,1bp+blue);

xaxis(Label("$x$",align=N),Ticks(Step=2,end=false,NoZero),Arrow());
yaxis(Label("$z$",align=E),Ticks(end=false),Arrow(),autorotate=false);


Comment pourrais-je construire un tableau de Solution sol[] pour différentes "conditions initiales" (et les tracer "élégamment") ?

Merci d'avance.
--
Christophe
cjorssen
Déca-utilisateur
 
Messages: 49
Inscription: Jeudi 05 Novembre 2009, 15:08
Statut actuel: Actif et salarié | Enseignant

Re: Intégrer un système d'équations différentielles

Messagepar GMaths » Lundi 14 Mars 2011, 19:56

cjorssen a écrit:Comment pourrais-je construire un tableau de Solution sol[] pour différentes "conditions initiales" (et les tracer "élégamment") ?


Je n'ai peut-être pas compris... mais s'il s'agit de les tracer.... alors ne suffit-il pas de faire une boucle pour répéter les lignes suivantes

Code: Tout sélectionner
sol=integrate(y=new real[] {0.1,0.1},
                 sys,a=0,b=3,n=100,
                 dynamic=true,tolmax=0.0001,RK4,verbose=true);
guide courbe=graph(transpose(sol.y)[0],transpose(sol.y)[1]);
draw(courbe,1bp+blue);


... en faisant varier {0.1,0.1} ?
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: Intégrer un système d'équations différentielles

Messagepar maurice » Lundi 14 Mars 2011, 19:59

Bonsoir,

Ce code ne compile pas chez moi, j'obtiens le message d'erreur :

error: recursive loading of module 'ode'


???

Maurice
Asymptote :
----> Démarrage rapide : http://cgmaths.fr/Atelier/Asymptote/Asymptote.html
----> Documentation 3D : http://www.mathco.tuxfamily.org et si ça ne marche pas, essayez la version pdf
maurice
Méga-utilisateur
 
Messages: 399
Inscription: Jeudi 25 Mars 2010, 13:49
Statut actuel: Actif et salarié | Enseignant

Re: Intégrer un système d'équations différentielles

Messagepar cjorssen » Lundi 14 Mars 2011, 22:47

GMaths a écrit:
cjorssen a écrit:Comment pourrais-je construire un tableau de Solution sol[] pour différentes "conditions initiales" (et les tracer "élégamment") ?


Je n'ai peut-être pas compris... mais s'il s'agit de les tracer.... alors ne suffit-il pas de faire une boucle pour répéter les lignes suivantes

Code: Tout sélectionner
sol=integrate(y=new real[] {0.1,0.1},
                 sys,a=0,b=3,n=100,
                 dynamic=true,tolmax=0.0001,RK4,verbose=true);
guide courbe=graph(transpose(sol.y)[0],transpose(sol.y)[1]);
draw(courbe,1bp+blue);


... en faisant varier {0.1,0.1} ?


Tout à fait, mais je ne savais pas le faire élégamment. Entre temps, j'ai trouvé cette belle façon de boucler
Code: Tout sélectionner
// Iterate over an array
int[] array={1,1,2,3,5};
for(int k : array) {
write(k);
}
J'ai écrit le code suivant (bon, c'est moche, ça serait bien que les valeurs de a et de b dans integrate s'adapte afin de tracer la fonction dans une fenêtre [xmin, xmax] [zmin,zmax] donnée (je ne vois pas là... faire une dichotomie sur a et b et tester à chaque fois le {x|z}{min|max} de la courbe obtenue ?)). Enfin, j'avance ! Bientôt plus besoin de maple : tout en asymptote 8)
Code: Tout sélectionner
import ode;
import gsl;
import graph;
import contour;
size(8cm,8cm,IgnoreAspect);

// diff(y[0]) = Ex(y[0],y[1])/sqrt(Ex^2 + Ez^2)
// diff(y[1]) = Ez(y[0],y[1])/sqrt(Ex^2 + Ez^2)
real Ex(real x, real z) {
  if (x == 0.) {
    return 0.;
  } else {
    real sqrt_aux = 2 * sqrt(x/(x^2 + 2*x + 1 + z^2));
    return 2*(x^2*E(asin(1),sqrt_aux) + F(asin(1),sqrt_aux)*x^2 -
         2*F(asin(1),sqrt_aux)*x + F(asin(1),sqrt_aux) +
         F(asin(1),sqrt_aux)*z^2 - E(asin(1),sqrt_aux) -
         E(asin(1),sqrt_aux)*z^2) *
      ((z^2-2*x+x^2+1)/(x^2+2*x+1+z^2))^(1/2)/(z^2-2*x+x^2+1)^(3/2)/x;}
}
 
real Ez(real x, real z) {
  return 4 * E(asin(1),2*(x/(x^2+2*x+1+z^2))^(1/2)) *
    ((z^2-2*x+x^2+1)/(x^2+2*x+1+z^2))^(1/2)*z/(z^2-2*x+x^2+1)^(3/2);}

real[] sys(real t, real[] y) {
  // Renvoie les seconds membres
  real ex = Ex(y[0],y[1]);
  real ez = Ez(y[0],y[1]);
  real e = sqrt(ex^2 + ez^2);
  return new real[] {ex/e,ez/e};}

Solution[] sol;
int i = 0;

// Iterate over an array
pair[] CI={(1,0.05),(1,1),(1,2),(1,3),
           (.5,0.05),(.5,1),(.5,2),(.5,3),
           (2,0.05),(2,1),(2,2),(2,3)};
for(pair k : CI) {
  sol[i]=integrate(y=new real[] {k.x,k.y},
         sys,a=-2,b=0,n=100,
         dynamic=true,tolmax=0.0001,RK4,verbose=true);
 
  guide courbe=graph(transpose(sol[i].y)[0],transpose(sol[i].y)[1]);

  draw(courbe,1bp+blue);}

real V(real x, real z) {
  return 4*F(asin(1),2*(x/(x^2+2*x+1+z^2))^(1/2))/sqrt(x^2+2*x+1+z^2);}

draw(contour(V,(.05,.05),(4,4),new real[] {1,2,3,4,5,6}));

xaxis(Label("$x$",align=N),Ticks(Step=2,end=false,NoZero),Arrow());
yaxis(Label("$z$",align=E),Ticks(end=false),Arrow(),autorotate=false);


maurice a écrit:Ce code ne compile pas chez moi, j'obtiens le message d'erreur :
error: recursive loading of module 'ode'


As-tu un asymptote compilé avec gsl ?

--
Christophe
cjorssen
Déca-utilisateur
 
Messages: 49
Inscription: Jeudi 05 Novembre 2009, 15:08
Statut actuel: Actif et salarié | Enseignant

Re: Intégrer un système d'équations différentielles

Messagepar maurice » Lundi 14 Mars 2011, 23:03

Bonsoir, gsl est installé ...

Code: Tout sélectionner
$ yum list gsl*
Paquets installés
gsl.x86_64                             1.14-1.fc14                       @fedora
gsl-devel.x86_64                       1.14-1.fc14                       @fedora
Paquets disponibles
gsl.i686                               1.14-1.fc14                       fedora
gsl-devel.i686                         1.14-1.fc14                       fedora


Maurice
Asymptote :
----> Démarrage rapide : http://cgmaths.fr/Atelier/Asymptote/Asymptote.html
----> Documentation 3D : http://www.mathco.tuxfamily.org et si ça ne marche pas, essayez la version pdf
maurice
Méga-utilisateur
 
Messages: 399
Inscription: Jeudi 25 Mars 2010, 13:49
Statut actuel: Actif et salarié | Enseignant

Re: Intégrer un système d'équations différentielles

Messagepar GMaths » Mercredi 16 Mars 2011, 15:15

cjorssen a écrit:J'ai écrit le code suivant (bon, c'est moche, ça serait bien que les valeurs de a et de b dans integrate s'adapte afin de tracer la fonction dans une fenêtre [xmin, xmax] [zmin,zmax] donnée (je ne vois pas là...

avec ceci
Code: Tout sélectionner
limits((0,0),(4,5),Crop);

avant xaxis et yaxis... tu devrais pouvoir modifier les valeurs de a et b sans que cela change ta fenêtre graphique.
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: Intégrer un système d'équations différentielles

Messagepar maurice » Mercredi 16 Mars 2011, 19:04

Je viens de comprendre :idea: !

maurice a écrit:Bonsoir,

Ce code ne compile pas chez moi, j'obtiens le message d'erreur :

error: recursive loading of module 'ode'


???

Maurice


J'avais appelé mon fichier ode.asy :mrgreen: :oops: !

Maurice
Asymptote :
----> Démarrage rapide : http://cgmaths.fr/Atelier/Asymptote/Asymptote.html
----> Documentation 3D : http://www.mathco.tuxfamily.org et si ça ne marche pas, essayez la version pdf
maurice
Méga-utilisateur
 
Messages: 399
Inscription: Jeudi 25 Mars 2010, 13:49
Statut actuel: Actif et salarié | Enseignant


Retourner vers Asymptote

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 5 invités