Maple : explication d'un comportement étrange?
Bonjour à tous et bonne année!!!
Pourquoi la procédure suivante ne fonctionne pas :
graphe1:=proc(Eq,x0)
local Courbes,Sol;
Sol:=op(2,dsolve({Eq,y(x0)=a/2},y(x)));
Courbes:={seq(Sol,a=-10..10)};
plot(Courbes,x=-5..5,-5..5);
end;
alors que ce bloc d'instructions fonctionne corectement
Eq:=diff(y(x),x)+y(x)=x^3;
x0:=0;
Sol:=op(2,dsolve({Eq,y(x0)=a/2},y(x)));
Courbes:={seq(Sol,a=-10..10)};
plot(Courbes,x=-5..5,-5..5);
?
Merci d'avance et @bientôt.
Pourquoi la procédure suivante ne fonctionne pas :
graphe1:=proc(Eq,x0)
local Courbes,Sol;
Sol:=op(2,dsolve({Eq,y(x0)=a/2},y(x)));
Courbes:={seq(Sol,a=-10..10)};
plot(Courbes,x=-5..5,-5..5);
end;
alors que ce bloc d'instructions fonctionne corectement
Eq:=diff(y(x),x)+y(x)=x^3;
x0:=0;
Sol:=op(2,dsolve({Eq,y(x0)=a/2},y(x)));
Courbes:={seq(Sol,a=-10..10)};
plot(Courbes,x=-5..5,-5..5);
?
Merci d'avance et @bientôt.
Réponses
-
Je pense avoir trouvé une explication et en tout cas, j'ai une solution au problème.
J'ai seulement transformé 'Sol' en une fonction de 'a'. Ainsi, Maple se rend compte que cela dépend de a. Dans le cas contraire, comme il évalue 'seq' avant d'évaluer 'Sol' qui est une variable locale, il ne s'en rendait pas compte (enfin, je crois que c'est ça l'explication... mais je n'en mettrai pas ma main au feu).
Toujours est-il que cette solution fonctionne :
graphe1:=proc(Eq,x0)
local Courbes,Sol;
Sol:=a->op(2,dsolve({Eq,y(x0)=a/2},y(x)));
Courbes:={seq(Sol(a),a=-10..10)};
plot(Courbes,x=-5..5,-5..5);
end; -
Bonjour.
Déjà 2 choses :
* Eq ne doit pas avoir de valeur assignée avant l'écriture de la procédure.
* Maple me dit que a n'a pas été déclaré local. Il est utile de le déclarer.
Je regarde encore.. -
Gerard> Concernant ta première remarque, un paramètre d'une procédure est géré grosso modo comme une variable locale. Si Eq contient déjà une donnée, cela ne pose pas de problème.
Concernant ta deuxième remarque, Maple ne m'indique pas que c'est une variable locale. Cela dit. En indiquant que a est une variable locale, cela ne marche toujours pas.
bisam> J'avais une autre alternative mais la tienne me convient mieux. Effectivement, il semble que Maple ne voit pas que Sol dépend de a alors que dans la feuille de calculs, il s'en aperçoit. Je ne comprends pas la logique qu'il y a derrière. -
Effectivement, Bisam.
Tu as mis le doigt sur le nœud du problème. Déclarer a comme variable locale ne suffit pas.
En décomposant la procédure, on voit que seq ne semble pas fonctionner de la même façon dans une procédure et en dehors. Et pourtant ...
En rentrant la définition de Sol dans celle de Courbes, ça marche :
graphe1:=proc(Eq,x0)
> local Courbes,Sol;
> Courbes:={seq(op(2,dsolve({Eq,y(x0)=a/2},y(x))),a=-10..10)};
> plot(Courbes,x=-5..5,-5..5);
> end;
Donc il y a quelque chose qu'on rate.
Cordialement -
En fait, je suis presque sûr que c'est une question d'évaluation incomplète.
Lorsque l'on essaie :
graphe2:=proc(Eq,x0)
local Courbes,Sol,a;
Sol:=op(2,dsolve({Eq,y(x0)=a/2},y(x)));
Courbes:={seq(eval(Sol),a=-10..10)};
plot(Courbes,x=-5..5,-5..5);
end;
où j'ai juste rajouté une évaluation forcée de 'Sol', la procédure fonctionne comme attendu.
Je ne pense pas que cela provienne du fonctionnement de 'seq' en particulier, mais plutôt de la façon d'évaluer des variables locales dans une procédure. -
Gerard> Ta solution est celle que j'avais envisagée mais quelque part on ne fait pas exactement l'enchaînement du bloc d'instructions que j'ai proposé; pour chaque valeur de a, on résout l'équation tandis que dans le bloc d'instructions, on fait d'abord une résolution avec un paramètre puis on remplace a par sa valeur.
P.S. : A bien y réfléchir, la première proposition de Bisam a le même problème. -
On peut s'affranchir de ce problème dans ma première proposition en remplaçant :
Sol:=a->op(2,dsolve({Eq,y(x0)=a/2},y(x)));
par
Sol:=unapply(op(2,dsolve({Eq,y(x0)=a/2},y(x))),a);
En effet, cette dernière façon de faire calcule d'abord la solution de l'équa diff avec 'a' comme paramètre puis la transforme en une fonction de 'a'. -
C'est bien un problème de fonctionnement de l'évaluation. En insérant des "print" dans la procédure, on voit que a n'est pas évalué dans le calcul de la séquence (C'est un des problèmes de Maple, il y a des niveaux d'évaluation et on ne sait pas, à priori lequel sera atteint.
Ma proposition fait effectivement résoudre 21 fois l'équation différentielles. Les deux propositions de Bisam ne font la résolution qu'une seule fois, c'est la fonction de a obtenue (sous forme fonction ou expression) qui est calculée. C'est donc bien la traduction du bloc d'instructions.
Cordialement
Connectez-vous ou Inscrivez-vous pour répondre.
Bonjour!
Catégories
- 164.5K Toutes les catégories
- 42 Collège/Lycée
- 22.1K Algèbre
- 37.4K Analyse
- 6.2K Arithmétique
- 56 Catégories et structures
- 1.1K Combinatoire et Graphes
- 13 Sciences des données
- 5.1K Concours et Examens
- 16 CultureMath
- 49 Enseignement à distance
- 2.9K Fondements et Logique
- 10.6K Géométrie
- 79 Géométrie différentielle
- 1.1K Histoire des Mathématiques
- 73 Informatique théorique
- 3.8K LaTeX
- 39K Les-mathématiques
- 3.5K Livres, articles, revues, (...)
- 2.7K Logiciels pour les mathématiques
- 24 Mathématiques et finance
- 329 Mathématiques et Physique
- 4.9K Mathématiques et Société
- 3.3K Pédagogie, enseignement, orientation
- 10.1K Probabilités, théorie de la mesure
- 786 Shtam
- 4.2K Statistiques
- 3.8K Topologie
- 1.4K Vie du Forum et de ses membres