[Mathematica] Comment indiquer la valeur max dans NDSolve ?

Tout ce qui concerne notamment les outils de calcul numérique, de calcul formel ou de géométrie.
[participation réservée aux membres 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.
Moloch

[Mathematica] Comment indiquer la valeur max dans NDSolve ?

Message non lu par Moloch »

Supposez que nous voulons résoudre une équation différentielle avec NDSolve :

Code : Tout sélectionner

NDSolve[{ x'[t] == f[ x[t] ],  x[0] == 3.4 ], { x }, {t, 0, 10}]
Mathematica donne la solution comme ceci :

Code : Tout sélectionner

Out[]=  {{ x -> InterpolatingFunction[{{ 0.,  2.6532}}, <>}}
Ensuite, nous voulons faire plusieurs graphiques de la solution. Comment indiquez la valeur maximale obtenue t = 2.6532 sans avoir à retaper cette variable à chaque fois, surtout si nous devons changer la condition initiale x[0] == 3.4 et refaire NDSolve encore d'autres fois ? Quel est le nom de la variable t_max obtenue par Mathematica ? Peut-on indiquer cette valeur dans une autre fonction ?
DUET
Utilisateur confirmé
Utilisateur confirmé
Messages : 64
Inscription : mercredi 01 juin 2005, 08:14

Message non lu par DUET »

Je ne sais pas quelle est ta fonction $f$ mais en supposant que ce soit $x\mapsto x^2$, voici ce que je ferais :

Code : Tout sélectionner

In[1]:=  f[t_] := t^2
In[2]:=  NDSolve[{x'[t] == f[x[t]], x[0] == 3.4}, {x}, {t, 0, 10}]
Out[2]=  {{x -> InterpolatingFunction[{{0., 0.294118}}, <>]}}
In[3]:=  t= (x /. Out[2])[[1]][[1]][[1]][[2]]
Out[3]= 0.294118
Moloch

Message non lu par Moloch »

Hmm, ca semble plus compliqué que je ne le croyais. Pourquoi tous ces [1][1]... ?

De plus, que dois-je écrire, si l'équ. diff. à résoudre est de la forme suivante ?

Code : Tout sélectionner

x'[t] == fx[ x[t], y[t], z[t]],
y'[t] == fy[ x[t], y[t], z[t]],
z'[t] == fz[ x[t], y[t], z[t]]
DUET
Utilisateur confirmé
Utilisateur confirmé
Messages : 64
Inscription : mercredi 01 juin 2005, 08:14

Message non lu par DUET »

Il y a 2 choses :

a) l'opérateur ( "/." + "->" )
b) les indices doublement crochetés ( "[[" +"]]").



a) ça c'est vraiment un truc à connaître dans Mathematica : quand on écrit

Code : Tout sélectionner

Expr[x,y]
il faut lire "expression fonction de x et y" et quand on écrit

Code : Tout sélectionner

Expr[x,y]/.y->z
il faut lire "Expr[x,z]" c'est-à-dire "expression fonction de x et z". C'est très pratique car c'est l'opérateur le plus "volatile" (c'est-à-dire le moins contraignant) parmi les opérateurs de type équation (définit(:=), affecte(=) ,égalise(==)) qui au contraire sont soit à effet permanent soit non-applicables à tout type d'expressions.

b)Est-ce que ça t'éclaire si je te dis que le nombre de "[[1]]" correspond (à la louche) au nombre d'accolades ouvrantes qu'il faut traverser pour arriver jusqu'à ce que tu cherches ?

Est-ce que ça t'éclaire si je te dis aussi que "X[[n]]" signifie "énième argument de X" ?

Quand tu as franchi la dernière accolade ouvrante (en fait c'est l'avant-dernière mais on en compte une en plus quand on rencontre une fonction), tu tombes sur {0., 0.294118}. Il ne reste donc plus qu'à rajouter "[[2]]" pour signaler que c'est le deuxième argument de {0., 0.294118} que tu veux.

Essaie d'enlever le "[[2]]", puis les "[[1]]" successivement et observe ce que Mathematica te réponds à chaque fois (sauf si c'est un message d'erreur auquel cas tente l'expérience avec autre chose) : tu devrais assez rapidement en déduire une manière de créer une expression barbare comme celle que j'ai indiquée à partir de n'importe laquelle des Out pour en extraire n'importe laquelle des quantités qui t'intéresse.
Moloch

Message non lu par Moloch »

Mouais, c'est pas très clair tout ça ! Ca me semble même plutôt nébuleux. Décidément, j'aime de moins en moins Mathematica. Au moins, ton truc fonctionne. Mon code répond bien, pour l'instant. Merci de l'aide.