【问题标题】:Find root of implicit function in Mathematica在 Mathematica 中查找隐函数的根
【发布时间】:2011-09-09 02:59:41
【问题描述】:

在 Mathematica 中查找隐函数的根

我有一个隐式函数,例如:

f(x,y) = x^3 + x*y + y^2 - 36

我想求根,即方程f(x,y) = 0的解

解法很简单:

ContourPlot[x^3 + x*y + y^2 - 36 == 0, {x, -2 Pi, 2 Pi}, {y, -3 Pi, 3 Pi}]

但是,我希望拥有绘图中的数据,而不仅仅是视觉绘图。 那么如何找到绘图的数据呢?

【问题讨论】:

  • 呃,嗯,你有你需要的数据在函数本身。如果f[x_,y_]=x^3 - x*y + y^2 - 36,那么对于任何你想要的xy,你都可以找到f[x,y]。但是由于您想找到此函数的根,因此它们位于此链接中给出的曲线上:wolframalpha.com/input/?i=Solve%5Bx^3+%2B+x*y+%2B+y^2+-+36%3D%3D0%2C {x%2Cy}%5D(抱歉,并非所有链接都突出显示...您需要将其复制并粘贴到浏览器中)。
  • 他想要 x 和 y 的值 f[x,y]==0,而不是任何旧的 f[x,y] 的值。
  • 这是个好问题。即如何在绘制后从绘图中获取数据。即 p=ContourPlot[ x^3 + x*y + y^2 - 36 == 0, {x, -2 Pi, 2 Pi}, {y, -3 Pi, 3 Pi}];现在如何从“p”中获取数据是我认为 OP 所要求的。
  • 是的。现在如何从'p'中获取数据?
  • 您可以通过查看在求解xy 中的一个时给出的曲线来得到它。

标签: function wolfram-mathematica root implicit


【解决方案1】:

我不确定我是否正确解释了您的第二个问题,但假设您需要生成的 ContourPlot 中的 (x,y) 点列表,执行此操作的一种方法可能如下:

plot = ContourPlot[
  x^3 + x*y + y^2 - 36 == 0, {x, -2 Pi, 2 Pi}, {y, -3 Pi, 3 Pi}]

获取点列表

points = Cases[Normal@plot, x_Line :> First@x, Infinity];

用 ListPlot '看看'

ListPlot[points, PlotRange -> {{-2 Pi, 2 Pi}, {-3 Pi, 3 Pi}}]

给予

编辑

Nasser 正确地指出,这个问题之前已经解决过。 Here 是指向基本相同问题的一个链接,而 Szabolcs 的 this answer 是相关的。

关于上面给出的答案,this method 可能更直接:

points2 = Cases[plot, x_GraphicsComplex :> First@x, Infinity]

最后,我应该承认“LunchTime Playground. Fun with Mathematica: How to extract points from a plot”,参见here,它给出了上面建议的两种方法(我现在经常使用这些方法) )。

编辑 2

此方法是对上述方法 1 的改进,因为点是作为 {x,y} 值列表(列表列表)获得的,没有任何多余的 { }。

Cases[Normal@plot, Line[{x__}] :> x, Infinity]

Paul Abbott 在 Mathematica Journal Vol 7, No 2, pp 108-112, 1998 中的一篇文章, 在区间内找根,提供了很多有用的信息,可在here

他指出以下也有效

Cases[Normal@plot, _Line, -1][[1, 1]]

和(!)

plot[[1, 1]]

我在 cmets 中引用了 FreshApple 的 question,其中可以找到以下方法的(轻微变体):

InputForm[plot][[1, 1, 1]]

以下计算结果为True

plot[[1, 1]] == Cases[Normal@plot, Line[{x__}] :> x, Infinity] == 
 InputForm[plot][[1, 1, 1]] == Cases[Normal@plot, _Line, -1][[1, 1]]

编辑 3

只是或有趣...

ListPlot@ContourPlot[x^2 + y^2 == 1, {x, -1, 1}, {y, -1, 1}][[1, 1]]

给予

【讨论】:

  • 不错。我记得在 SO 看到过这样的东西,但就是不记得是怎么回事。搜索 SO 太难了,太糟糕了,因为这里有很好的信息,但很难找到和搜索。
  • @Nasser。是的,你是对的。我添加了几个链接(基本上是同一个问题),我怀疑还有其他链接。
  • 请参阅 FreshApple 提出的this 问题,了解使用PartInputForm 的非常简洁的方法。在我看来,这比上面建议的方法要好得多。我已要求 FreshApple 考虑发布答案
【解决方案2】:

我鼓励您探索documentation on equation solving,尤其是SolveNSolve 函数。

编辑

p = ContourPlot[x^3 + x*y + y^2 - 36 == 0, {x, -2 Pi, 2 Pi}, {y, -3 Pi, 3 Pi}]
p //InputForm

复制并粘贴您需要的部分。

或者,在我看来,这是对您的实际问题的更好解决方案。

sol = Solve[x^3 + x*y + y^2 - 36 == 0,{x}][[1]] 

您可能需要一些选项来获得正确的解决方案。

Table[{x/. sol,y},{y, -3 Pi, 3 Pi, 0.02}]

【讨论】:

  • 即绘制后如何从绘图中获取数据。即 p=ContourPlot[ x^3 + x*y + y^2 - 36 == 0, {x, -2 Pi, 2 Pi}, {y, -3 Pi, 3 Pi}];现在如何从'p'中获取数据?
  • 嗯,这不是你最初的问题。我正在使用的机器上没有 Mathematica,但请查看答案的编辑。
  • @h02h001 在您的平行问题中询问有关 Matlab 的相同问题,您确实明确表示“如何从绘图中获取数据?” stackoverflow.com/questions/7356551/… 这个问题不是你问的,但无论如何,在 Mathematica 中,更好的方法不是画图并从中获取数据,而是直接计算出解决方案。
  • //InputForm 没问题!非常感谢。有些方程不能用 Solve、 NSolve 求解。如: Solve[E^(-(1/20) (-50 + y)^2) y - y Erf[125 - 9 y] + x y Erf[50 - 9 x y] == 0, {x}] NSolve[E^(-(1/20) (-50 + y)^2) y - y Erf[125 - 9 y] + x y Erf[50 - 9 x y] == 0, {x}] 你知道吗ContourPlot 的算法?
  • //InputForm 没问题!非常感谢。
【解决方案3】:

对 Verbeia 的回答贡献 0.02 美元:

记得检查 x(y) 和 y(x) 解决方案,因为其中一个可能比另一个更干净。

在你的例子中:

【讨论】:

  • 非常感谢。有些方程不能用 Solve、 NSolve 求解。如: Solve[E^(-(1/20) (-50 + y)^2) y - y Erf[125 - 9 y] + x y Erf[50 - 9 x y] == 0, {x}] NSolve[E^(-(1/20) (-50 + y)^2) y - y Erf[125 - 9 y] + x y Erf[50 - 9 x y] == 0, {x}]
  • @belisarius(与答案无关),mma 房间已被冻结。可以解冻吗?
  • @belisarius 解冻了 :) 我们需要增加活动,以免它再次被冻结。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多