Как я могу использовать Mathematica для неявного решения дифференциальных уравнений одной переменной? - PullRequest
4 голосов
/ 15 сентября 2011

Я пытаюсь заставить Mathematica неявно дифференцировать уравнение эллипса в форме:

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

с a = 8 и b = 6.

Используемой мной командойвыглядит так:

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

, где y->3/4*Sqrt[6400-x^2] происходит от решения y в терминах x.

Я получил это далеко, следуя совету, найденному здесь: http://www.hostsrv.com/webmaa/app1/MSP/webm1010/implicit

Входные данные для этого сценария являются традиционным способом выражения неявных отношений между x и y в учебниках по исчислению.В Mathematica вам нужно сделать это отношение явным, используя y [x] вместо y.Это делается автоматически в сценарии, заменяя все вхождения y на y [x].

Но решение, которое дает Mathematica, не содержит y' или dy/dx (как, когда я решилэто от руки).Поэтому я не думаю, что это было решено правильно.Любая идея о том, какая команда заставит программу решить неявный дифференциал?Благодарю.

1 Ответ

8 голосов
/ 15 сентября 2011

Концептуально самый простой вариант (как вы упомянули) - сделать y функцией x и использовать оператор частичной производной 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]))}}

Но для более сложных отношений лучше использовать оператор полной производной 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))}}

Обратите внимание, что было бы лучше использовать SetAttributes[{a, b}, Constant] вместо команды SetOptions[Dt, Constants -> {a, b}] ... Тогда Dt не несет в себе весь этот лишний мусор.

Последний вариант (который вы также упомянули) - решить исходное уравнение для y[x], хотя это не всегда возможно ...

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}}

И вы можете проверить, что оно удовлетворяет дифференциальному уравнению, которое мы вывели выше для обоих решений

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

Out[7]= True

Вы можете в любое время заменить значения a = 8 и b = 6 правилом замены {a->8, b->6}.

Если вы действительно решите свое дифференциальное уравнение y'[x] == -((b^2 x)/(a^2 y[x]), используя DSolve с правильным начальным условием (полученным из исходного уравнения эллипса), тогда вы восстановите решение для y в терминах x дано выше.

...