4

我试图强制 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[x] 替换所有出现的 y 在脚本中自动完成的。

但是 Mathematica 给出的解决方案没有y'dy/dx在其中(就像我手动解决它时一样)。所以我认为它没有得到正确解决。关于什么命令可以让程序解决隐式微分的任何想法?谢谢。

4

1 回答 1

8

概念上最简单的选择(如您所提到的)是制作y一个函数x并使用偏导数运算符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]))}}

但对于更复杂的关系,最好使用全导算子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

于 2011-09-15T13:11:35.403 回答