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

fra*_*lin 4 math wolfram-mathematica differentiation

我试图强迫Mathematica隐式区分形式的椭圆方程:

x^2/a^2+y^2/b^2 == 100
Run Code Online (Sandbox Code Playgroud)

a = 8b = 6.

我正在使用的命令如下所示:

D[x^2/a^2 + y^2/b^2 == 100/. y -> 3/4*Sqrt[6400-x^2], x]
Run Code Online (Sandbox Code Playgroud)

其中,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在其中(就像我手工解决它).所以我认为它没有得到正确解决.任何关于什么命令会让程序解决隐式差异的想法?谢谢.

Sim*_*mon 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]))}}
Run Code Online (Sandbox Code Playgroud)

但对于更复杂的关系,最好使用总导数运算符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))}}
Run Code Online (Sandbox Code Playgroud)

请注意,使用它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}}
Run Code Online (Sandbox Code Playgroud)

并且您可以检查它是否满足我们在上述两个解决方案中推导出的微分方程

In[7]:= D[y /. rep[[1]], x] == -((b^2 x)/(a^2 y)) /. rep[[1]]

Out[7]= True
Run Code Online (Sandbox Code Playgroud)

您也可以替换你的价值观a = 8,并b = 6与替换规则,随时随地{a->8, b->6}.

如果您实际y'[x] == -((b^2 x)/(a^2 y[x])使用DSolve以正确的初始条件(从原始椭圆方程导出)求解微分方程,那么您将y根据x上面给出的方法恢复解.