如何使用mathematica隐式求解单个变量的微分方程?

时间:2011-09-15 13:01:07

标签: math wolfram-mathematica differentiation

我试图强迫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]来自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 个答案:

答案 0 :(得分:8)

概念上最简单的选项(如您所述)是将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使用正确的初始条件(从原始椭圆方程导出)实际求解微分方程y'[x] == -((b^2 x)/(a^2 y[x]),那么您将恢复y的解决方案上面给出了x