首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python (渐近)隐式函数:获取值而不是图?

python (渐近)隐式函数:获取值而不是图?
EN

Stack Overflow用户
提问于 2015-07-31 13:20:16
回答 2查看 3.8K关注 0票数 9

我对渐变还不熟悉,但是当我用渐近来绘制隐式函数(实际上是卡西尼氏卵的公式)时,我已经得到了一个很好的输出:

代码语言:javascript
复制
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值?或者完全不用绘图就能解出隐式方程?

谢谢!:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-10 14:09:17

这是你的回答

实际上,是否有可能以某种方式得到对应于这幅图的x和y值?

我说“寻址”是因为不可能获得用于绘制曲线的xy值,因为曲线不是用2D点…序列绘制的。稍后会有更多介绍,

TL;博士

代码语言:javascript
复制
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])

让我们从您的代码开始

代码语言:javascript
复制
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对象并打印它

代码语言:javascript
复制
pli = plot_implicit(eq)
print(pli)

要获得

代码语言:javascript
复制
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索引的对象感兴趣,

代码语言:javascript
复制
ob = pli[0]
print(dir(ob))

(省略号是我的)

代码语言:javascript
复制
['__class__', …, get_points, …, 'var_y']

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

代码语言:javascript
复制
 print(ob.get_points())

这给了(为清晰和大的剪裁编辑)

代码语言:javascript
复制
([
  [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使用绘制函数的区间算法

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

代码语言:javascript
复制
 self.ax.fill(x, y, facecolor=s.line_color, edgecolor='None')

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

代码语言:javascript
复制
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有不相交的矩形)。

我们可以得出这样的结论:

代码语言:javascript
复制
l_xy_intervals = ((pli[0]).get_points())[0]

表示正在绘制的隐式表达式为“足够真”的矩形区域。

票数 3
EN

Stack Overflow用户

发布于 2021-12-17 22:06:58

你可以这样做,即使用区间数学,如果你试着得到每个间隔的中点。从代码开始,稍微修改一下,将plot_implicit对象保存在一个名为g的变量中:

代码语言:javascript
复制
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的变量中保存用于绘制绘图的间隔。

代码语言:javascript
复制
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,“足够真实”,成为我们的数值解之一。

这样,就可以用以下方法生成由中间点对组成的数据帧:

代码语言:javascript
复制
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()

在这个例子中会给我们:

代码语言:javascript
复制
           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

每当需要从“区间数学”到“标准”点级数学时,就可以使用这种获取间隔中间点的想法。希望这能有所帮助。致以问候。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31747210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档