的概念最簡單的選擇(如你所提到的)是使y
的x
的功能和使用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 = 8
和b = 6
。
如果實際使用DSolve與正確的初始條件(從原來的橢圓方程導出),那麼你就恢復在上面給出的x
條款y
解決方案解決您的微分方程y'[x] == -((b^2 x)/(a^2 y[x])
。
+1。我非常同意這樣一個建議,即不要在全局範圍內設置'Dt'的屬性,因爲這可能相當容易出錯。我甚至不確定首先顯示這種用法是一個好主意 - 您可以明確地將選項傳遞給'Dt'。 –
@Leonid:它如何容易出錯?你能提供一個例子嗎? – Simon
如果您首先將某些符號設置爲全局常量'Dt',然後將其忘記並進行一些與'Dt'和這些符號無關的計算,則可能會得到令人驚訝的結果。提到的計算可能會以某種不明顯的方式調用Dt,比如頂層代碼是一些系統函數。更糟糕的是,如果有人esle寫了一些軟件包等,並在那裏做了,然後你使用該軟件包,你甚至不會知道它,結果會非常令人費解。 –