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