我试图强迫Mathematica隐式区分形式的椭圆方程:
x^2/a^2+y^2/b^2 == 100
a = 8
和b = 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
(就像我手工解决它一样)。所以我认为它没有得到正确解决。任何关于什么命令会让程序解决隐式差异的想法?谢谢。
答案 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
。