python (sympy) 隐式函数:获取值而不是绘图?
python (sympy) implicit function: get values instead of plot?
我是 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)
现在是否真的有可能以某种方式获得与图相对应的 x 和 y 值?或者根本不绘制来求解隐式方程?
谢谢! :-)
这是针对您
的回答
is it actually possible to somehow get the x and y values corresponding to the plot?
我说 "addressing" 因为不可能得到用于绘制曲线的 x
和 y
值——因为曲线不是使用一系列二维点绘制的……稍后会详细介绍,
TL;DR
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.py
和 plot,py
的源代码,人们意识到,在这种情况下,实际绘图(谈到 matpolotlib
后端)只是一行代码
self.ax.fill(x, y, facecolor=s.line_color, edgecolor='None')
其中 x
和 y
是从 .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]
表示您正在绘制的隐式表达式所在的矩形区域
"true enough"
如果您尝试获取每个区间的中点,即使使用区间数学也可以做到这一点。从你的代码开始,稍微改变它,通过将 plot_implicit
对象保存在一个名为 g
的变量中,我们有:
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)
g = plot_implicit(eq)
现在让我们将用于绘制绘图的间隔保存在名为 ptos
的变量中。
ptos = g[0].get_points()[0]
这样 ptos[0][0]
将是 x 轴上的第一个间隔,而 ptos[0][1]
将是它在 y 轴上的一对。间隔有一个称为 mid
的 属性,它给出了间隔的中点。所以你可以假设 ptos[0][0].mid, ptos[0][1].mid
将是一对 x,y
“足够真实”成为我们的数值解之一。
这样,可以生成由这些中间点对组成的数据框:
intervs = np.array(dtype='object')
meio = lambda x0:x0.mid
px = list(map(meio, intervs[:,0]))
py = list(map(meio, intervs[:,1]))
import pandas as pd
dados = pd.DataFrame({'x':px, 'y':px})
dados.head()
在这个例子中会给我们:
x y
0 -1.177733 0.598826
1 -1.175389 0.596483
2 -1.175389 0.598826
3 -1.173045 0.596483
4 -1.173045 0.598826
只要需要从“区间数学”转移到“标准”点级数学,就可以使用这种获取区间中点的想法。希望这可以帮助。问候。
我是 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)
现在是否真的有可能以某种方式获得与图相对应的 x 和 y 值?或者根本不绘制来求解隐式方程?
谢谢! :-)
这是针对您
的回答is it actually possible to somehow get the x and y values corresponding to the plot?
我说 "addressing" 因为不可能得到用于绘制曲线的 x
和 y
值——因为曲线不是使用一系列二维点绘制的……稍后会详细介绍,
TL;DR
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.py
和 plot,py
的源代码,人们意识到,在这种情况下,实际绘图(谈到 matpolotlib
后端)只是一行代码
self.ax.fill(x, y, facecolor=s.line_color, edgecolor='None')
其中 x
和 y
是从 .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]
表示您正在绘制的隐式表达式所在的矩形区域 "true enough"
如果您尝试获取每个区间的中点,即使使用区间数学也可以做到这一点。从你的代码开始,稍微改变它,通过将 plot_implicit
对象保存在一个名为 g
的变量中,我们有:
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)
g = plot_implicit(eq)
现在让我们将用于绘制绘图的间隔保存在名为 ptos
的变量中。
ptos = g[0].get_points()[0]
这样 ptos[0][0]
将是 x 轴上的第一个间隔,而 ptos[0][1]
将是它在 y 轴上的一对。间隔有一个称为 mid
的 属性,它给出了间隔的中点。所以你可以假设 ptos[0][0].mid, ptos[0][1].mid
将是一对 x,y
“足够真实”成为我们的数值解之一。
这样,可以生成由这些中间点对组成的数据框:
intervs = np.array(dtype='object')
meio = lambda x0:x0.mid
px = list(map(meio, intervs[:,0]))
py = list(map(meio, intervs[:,1]))
import pandas as pd
dados = pd.DataFrame({'x':px, 'y':px})
dados.head()
在这个例子中会给我们:
x y
0 -1.177733 0.598826
1 -1.175389 0.596483
2 -1.175389 0.598826
3 -1.173045 0.596483
4 -1.173045 0.598826
只要需要从“区间数学”转移到“标准”点级数学,就可以使用这种获取区间中点的想法。希望这可以帮助。问候。