2011-09-15 2 views
4

は私が暗黙のうちに、フォームの楕円方程式を区別するためにMathematicaを強制しようとしている: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

入力は、xとy beween暗黙の 関係は微積分の教科書に発現していることが従来の方法です。 Mathematicaではyの代わりにy [x] を使ってこの関係を明示的にする必要があります。これはスクリプト内で自動的に実行され、 はすべてyの出現をy [x]に置き換えます。

しかし、Mathematicaが与えられる解決策は、(私は手でそれを解決したときのように)その中にy'またはdy/dxを持っていません。だから私はそれが正しく解決されたとは思わない。どのようなコマンドを使って暗黙の差分を解くことができるかについての考え方はありますか?ありがとう。

答えて

8

概念的に最も簡単なオプションは、(あなたが述べたように)xy機能を作り、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))}} 
を使用することをお勧めします

SetOptions[Dt, Constants -> {a, b}]コマンドの代わりにSetAttributes[{a, b}, Constant]を使用するほうがうまくないかもしれないことに注意してください。そして、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を使って微分方程式を解くy'[x] == -((b^2 x)/(a^2 y[x])なら、あなたは上記のxの面でyのためのソリューションを回復します。

+0

+1。 'Dt'の属性をグローバルに設定しないという提案には、これがかなり誤りを起こす可能性があるので、私は強く同意します。私はこの使い方を最初に示すことは良いアイデアであるとは確信していません - オプションを明示的に 'Dt'に渡すことができます。 –

+0

@レオニード:どのようにエラーが発生しやすいですか?あなたは例を挙げることができますか? – Simon

+1

いくつかのシンボルを最初に 'Dt'の定数にグローバルに設定し、それを忘れて、' Dt'とそれらのシンボルを含む無関係の計算を行うと、驚くべき結果が得られます。前述の計算は、いくつかの自明な方法で 'Dt'を呼び出すことができます。例えばトップレベルのコードはいくつかのシステム関数です。さらに悪いことに、ある人がパッケージなどを書いてそこで行った場合、そのパッケージを使用すると、そのことについても知りませんし、結果は非常に困惑します。 –

関連する問題