python(sympy)隐式函数:获取值而不是plot?

xar*_*tra 7 python plot implicit sympy

我很新见,但是当我使用sympy 绘制隐式函数(实际上是Cassini椭圆的公式)时,我已经得到了很好的输出:

from sympy import plot_implicit, symbols, Eq, solve
x, y = symbols('x y')
k=2.7
a=3
eq = Eq((x**2 + y**2)**2-2*a**2*(x**2-y**2), k**4-a**4)
plot_implicit(eq)
Run Code Online (Sandbox Code Playgroud)

现在实际上可以以某种方式获得对应于图的xy值吗?或者在没有绘图的情况下求解隐式方程?

谢谢!:-)

gbo*_*ffi 3

这是针对您的答案

\n\n
\n

实际上是否有可能以某种方式获得与绘图相对应的 x 和 y 值?

\n
\n\n

我说“寻址”是因为不可能获得用于绘制曲线 \xe2\x80\x94 的xy值,因为曲线不是使用 2D 点序列 \xe2\x80\xa6 绘制的之后,

\n\n
\n\n

长话短说

\n\n
pli = plot_implicit(...)\nseries = pli[0]\ndata, action = series.get_points()\ndata = np.array([(x_int.mid, y_int.mid) for x_int, y_int in data])\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

让我们从您的代码开始

\n\n
from sympy import plot_implicit, symbols, Eq, solve\nx, y = symbols(\'x y\')\nk=2.7\na=3\neq = Eq((x**2 + y**2)**2-2*a**2*(x**2-y**2), k**4-a**4)\n
Run Code Online (Sandbox Code Playgroud)\n\n

并绘制它,但有一点不同:我们保存Plot对象并打印它

\n\n
pli = plot_implicit(eq)\nprint(pli)\n
Run Code Online (Sandbox Code Playgroud)\n\n

要得到

\n\n
Plot object containing:\n[0]: Implicit equation: Eq(-18*x**2 + 18*y**2 + (x**2 + y**2)**2, -27.8559000000000) for x over (-5.0, 5.0) and y over (-5.0, 5.0)\n
Run Code Online (Sandbox Code Playgroud)\n\n

我们对这个由 索引的对象感兴趣0

\n\n
ob = pli[0]\nprint(dir(ob))\n
Run Code Online (Sandbox Code Playgroud)\n\n

这给出了(省略号是我的)

\n\n
[\'__class__\', \xe2\x80\xa6, get_points, \xe2\x80\xa6, \'var_y\']\n
Run Code Online (Sandbox Code Playgroud)\n\n

这个名字get_points听起来充满希望,不是吗?

\n\n
 print(ob.get_points())\n
Run Code Online (Sandbox Code Playgroud)\n\n

这给出了(为了清晰起见进行了编辑并进行了大幅削减)

\n\n
([\n  [interval(-3.759774, -3.750008), interval(-0.791016, -0.781250)],\n  [interval(-3.876961, -3.867195), interval(-0.634768, -0.625003)],\n  [interval(-3.837898, -3.828133), interval(-0.693361, -0.683596)],\n  [interval(-3.847664, -3.837898), interval(-0.673830, -0.664065)],\n  ...\n  [interval(3.837895, 3.847661), interval(0.664064, 0.673830)],\n  [interval(3.828130, 3.837895), interval(0.683596, 0.693362)],\n  [interval(3.867192, 3.876958), interval(0.625001, 0.634766)],\n  [interval(3.750005, 3.759770), interval(0.781255, 0.791021)]\n  ], \'fill\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是什么?的文档plot_implicit

\n\n
\n

plot_implicit默认情况下,使用区间算术来绘制函数

\n
\n\n

跟随源代码,plot_implicit.py我们plot,py意识到,在这种情况下,实际的绘图(就后端而言matpolotlib)只是一行代码

\n\n
 self.ax.fill(x, y, facecolor=s.line_color, edgecolor=\'None\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

其中xy是根据从 中返回的间隔列表构造的.get_points(),如下所示

\n\n
x, y = [], []\nfor intervals in interval_list:\n    intervalx = intervals[0]\n    intervaly = intervals[1]\n    x.extend([intervalx.start, intervalx.start,\n                  intervalx.end, intervalx.end, None])\n    y.extend([intervaly.start, intervaly.end,\n                  intervaly.end, intervaly.start, None])\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,对于每对间隔,matplotlib都被指示绘制一个填充的矩形,该矩形足够小,以便眼睛看到一条连续的线(注意使用 来None获得不相交的矩形)。

\n\n

我们可以得出结论,区间对的列表

\n\n
l_xy_intervals = ((pli[0]).get_points())[0]\n
Run Code Online (Sandbox Code Playgroud)\n\n

表示您正在绘制的隐式表达式\n “足够真实”的矩形区域

\n