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

Tout ce qui concerne le langage Asymptote. Ce langage est utilisable sur le forum via les balises asy.
[participation réservée aux utilisateurs inscrits]
Règles du forum
Merci de soigner la rédaction de vos messages et de consulter ce sujet avant de poster. Pensez également à utiliser la fonction recherche du forum.
cjorssen

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

Message non lu par cjorssen »

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
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

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

Message non lu par GMaths »

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 : viewtopic.php?p=117186#p117186
il y a quelques mois.
cjorssen

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

Message non lu par cjorssen »

Bonsoir et merci de ta réponse.
GMaths a écrit :On l'a évoquée ici : viewtopic.php?p=117186#p117186
il y a quelques mois.
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
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

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

Message non lu par GMaths »

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)]$ ?
cjorssen

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

Message non lu par cjorssen »

GMaths a écrit :On l'a évoquée ici : viewtopic.php?p=117186#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

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

Message non lu par cjorssen »

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
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

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

Message non lu par GMaths »

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} ?
maurice
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 399
Inscription : jeudi 25 mars 2010, 13:49

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

Message non lu par maurice »

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
cjorssen

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

Message non lu par cjorssen »

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
maurice
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 399
Inscription : jeudi 25 mars 2010, 13:49

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

Message non lu par maurice »

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
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

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

Message non lu par GMaths »

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.
maurice
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 399
Inscription : jeudi 25 mars 2010, 13:49

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

Message non lu par maurice »

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
Répondre
  • Sujets similaires
    Réponses
    Vues
    Dernier message