python (sympy) 隐式函数 : get values instead of plot?

标签 python plot sympy implicit

我是 sympy 的新手,但是当我使用 sympy 绘制隐式函数(实际上是 Cassini's ovals 的公式)时,我已经得到了一个不错的输出:

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)

现在是否真的有可能以某种方式获得与绘图相对应的 xy 值?或者根本不绘制就可以求解隐式方程?

谢谢! :-)

最佳答案

这是针对您的回答

is it actually possible to somehow get the x and y values corresponding to the plot?

我说 “寻址” 因为不可能获得用于绘制曲线的 xy 值 — 因为曲线不是使用一系列二维点绘制的……稍后会详细介绍,


长话短说

pli = plot_implicit(...)
series = pli[0]
data, action = series.get_points()
data = np.array([(x_int.mid, y_int.mid) for x_int, y_int in data])

让我们从您的代码开始

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 对象并打印它

pli = plot_implicit(eq)
print(pli)

得到

Plot object containing:
[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)

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

ob = pli[0]
print(dir(ob))

给出(省略号是我的)

['__class__', …, get_points, …, 'var_y']

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

 print(ob.get_points())

给出(为清晰起见并进行了大幅删减)

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

这是什么? plot_implicit 的文档有

plot_implicit, by default, uses interval arithmetic to plot functions.

根据 plot_implicit.pyplot,py 的源代码,人们意识到,在这种情况下,实际的绘图(说到 matpolotlib backend) 只是一行代码

 self.ax.fill(x, y, facecolor=s.line_color, edgecolor='None')

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

x, y = [], []
for intervals in interval_list:
    intervalx = intervals[0]
    intervaly = intervals[1]
    x.extend([intervalx.start, intervalx.start,
                  intervalx.end, intervalx.end, None])
    y.extend([intervaly.start, intervaly.end,
                  intervaly.end, intervaly.start, None])

因此对于每对间隔,matplotlib 被引导绘制一个填充的矩形,足够小以至于眼睛看到一条连续的线(注意使用 None 有不相交的矩形)。

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

l_xy_intervals = ((pli[0]).get_points())[0]

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

关于python (sympy) 隐式函数 : get values instead of plot?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31747210/

相关文章:

使用 lambda 的 Python 列表理解

python - pyqt5 应用程序中嵌入的 qtconsole 无法按预期工作

python - 从 SymPy 符号定义函数

r - ggplot2:根据填充值为某些点设置alpha = 0

r - 单独保存图(ggplot2)

python - 使用 sympy 反转函数并评估反转函数给了我一个错误的答案

python - Sympy:获取矩阵幂的列

python - 有没有办法替换和删除多行字符串的行

python - 使用 Pandas 重新采样比原始时间范围更长的时间

wolfram-mathematica - Mathematica中地 block 的标准颜色是什么?