2011-09-15 2 views
4

Je suis en train de forcer Mathematica à différencier implicitement une équation d'ellipse de la forme:Comment utiliser mathematica pour résoudre implicitement des équations différentielles d'une seule variable?

x^2/a^2+y^2/b^2 == 100 

avec a = 8 et b = 6.

La commande J'utilise ressemble à ceci:

D[x^2/a^2 + y^2/b^2 == 100/. y -> 3/4*Sqrt[6400-x^2], x] 

où, y->3/4*Sqrt[6400-x^2] vient de résoudre y en termes de x.

J'ai eu ce jour en suivant les conseils qui se trouvent ici: http://www.hostsrv.com/webmaa/app1/MSP/webm1010/implicit

entrée pour ce script est la voie classique qui est exprimé une relation implicite beween x et y dans les manuels de calcul. Dans Mathematica vous devez rendre cette relation explicite en utilisant y [x] à la place de y. Ceci est fait automatiquement dans le script en remplaçant toutes les occurrences de y avec y [x].

Mais la solution Mathematica donne ne pas y' ou dy/dx dedans (comme quand je l'ai résolu à la main). Donc je ne pense pas que cela a été résolu correctement. Toute idée sur quelle commande permettrait au programme de résoudre un différentiel implicite? Merci.

Répondre

8

L'option conceptuellement plus facile (comme vous l'avez mentionné) est de faire y fonction de x et utiliser le partial derivative operator D[]

In[1]:= D[x^2/a^2 + y[x]^2/b^2 == 100, x] 
     Solve[%, y'[x]] 

Out[1]= (2 x)/a^2 + (2 y[x] y'[x])/b^2 == 0 

Out[2]= {{y'[x] -> -((b^2 x)/(a^2 y[x]))}} 

Mais pour des relations plus compliquées, il est préférable d'utiliser le total derivative operator Dt[]

In[3]:= SetOptions[Dt, Constants -> {a, b}]; 

In[4]:= Dt[x^2/a^2 + y^2/b^2 == 100, x] 
     Solve[%, Dt[y, x]] 

Out[4]= (2 x)/a^2 + (2 y Dt[y, x, Constants -> {a, b}])/b^2 == 0 

Out[5]= {{Dt[y, x, Constants -> {a, b}] -> -((b^2 x)/(a^2 y))}} 

Notez qu'il peut être plus facile d'utiliser SetAttributes[{a, b}, Constant] au lieu de la commande SetOptions[Dt, Constants -> {a, b}] ... Alors le Dt ne porte pas tout cette ordure supplémentaire.

La dernière option (que vous avez mentionné) est de résoudre l'équation d'origine pour y[x], bien que ce n'est pas toujours possible ...

In[6]:= rep = Solve[x^2/a^2 + y^2/b^2 == 100, y] 

Out[6]= {{y -> -((b Sqrt[100 a^2 - x^2])/a)}, {y -> (b Sqrt[100 a^2 - x^2])/a}} 

Et vous pouvez vérifier qu'il satisfait l'équation différentielle nous avons calculé ci-dessus pour les deux solutions

In[7]:= D[y /. rep[[1]], x] == -((b^2 x)/(a^2 y)) /. rep[[1]] 

Out[7]= True 

Vous pouvez remplacer vos valeurs a = 8 et b = 6 à tout moment avec la règle de remplacement {a->8, b->6}.

Si vous résolvez réellement votre équation différentielle y'[x] == -((b^2 x)/(a^2 y[x]) utilisant DSolve avec la condition initiale correcte (dérivée de l'équation de l'ellipse d'origine), alors vous allez récupérer la solution pour y en termes de x donnés ci-dessus.

+0

+1. Je suis entièrement d'accord avec la suggestion de ne pas définir globalement les attributs de 'Dt', car cela peut être assez sujet aux erreurs.Je ne suis même pas sûr que montrer cette utilisation en premier lieu est une bonne idée - vous pourriez passer les options à 'Dt' explicitement à la place. –

+0

@Leonid: En quoi l'erreur est-elle sujette? Pouvez vous donner un exemple? – Simon

+1

Si vous définissez d'abord des symboles pour des constantes pour 'Dt' globalement, puis que vous l'oubliez et que vous faites des calculs non liés impliquant' Dt' et ces symboles, vous obtiendrez des résultats surprenants. Les calculs mentionnés peuvent invoquer 'Dt' d'une manière non évidente, disons que le code de niveau supérieur est une fonction du système. Pire encore, si quelqu'un a écrit un paquet etc et l'a fait là, et que vous utilisez ce paquet, vous ne le saurez même pas, et les résultats seront * très * déroutants. –

Questions connexes