2011-09-15 110 views
4

我試圖迫使數學隱含區分形式的橢圓方程:如何使用mathematica隱式求解單個變量的微分方程?

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

a = 8b = 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]來自於x方面解決y

我能走到今天按照這裏找到的建議:http://www.hostsrv.com/webmaa/app1/MSP/webm1010/implicit

輸入此腳本是beween x和y的隱式 關係演算的教科書表示傳統的方式。在 Mathematica中,您需要通過使用y [x] 來代替y來明確這種關係。這是在腳本中自動完成的,用y [x]代替 y的所有出現。

但解決數學給人沒有在它y'dy/dx(比如當我解決了它的手)。所以我認爲它沒有被正確解決。任何關於什麼命令會讓程序解決隱式差異的想法?謝謝。

回答

8

的概念最簡單的選擇(如你所提到的)是使yx的功能和使用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]))}} 

但是對於更復雜的關係,最好使用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))}} 

請注意,使用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 = 8b = 6

如果實際使用DSolve與正確的初始條件(從原來的橢圓方程導出),那麼你就恢復在上面給出的x條款y解決方案解決您的微分方程y'[x] == -((b^2 x)/(a^2 y[x])

+0

+1。我非常同意這樣一個建議,即不要在全局範圍內設置'Dt'的屬性,因爲這可能相當容易出錯。我甚至不確定首先顯示這種用法是一個好主意 - 您可以明確地將選項傳遞給'Dt'。 –

+0

@Leonid:它如何容易出錯?你能提供一個例子嗎? – Simon

+1

如果您首先將某些符號設置爲全局常量'Dt',然後將其忘記並進行一些與'Dt'和這些符號無關的計算,則可能會得到令人驚訝的結果。提到的計算可能會以某種不明顯的方式調用Dt,比如頂層代碼是一些系統函數。更糟糕的是,如果有人esle寫了一些軟件包等,並在那裏做了,然後你使用該軟件包,你甚至不會知道它,結果會非常令人費解。 –