2011-09-15 70 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写了一些软件包等,并在那里做了,然后你使用该软件包,你甚至不会知道它,结果会非常令人费解。 –