首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Matplotlib绘制Sympy隐函数

用Matplotlib绘制Sympy隐函数
EN

Stack Overflow用户
提问于 2022-11-05 09:25:10
回答 2查看 47关注 0票数 0

我有一个隐式函数,比如x**2 - y = 0 (为了简化),我想要获得某个范围内的x值的图。

sympy.plot_implicit通常会传播一些我不满意的台词。

我希望能够访问所绘制的值,所以pyplot.plot比我更好。通常,我使用下面的代码来绘制显式Sympy函数,但我不知道如何在exp = sym.Eq(x**2 - y, 0)中使用类似的东西。有人有办法解决这个问题吗?

代码语言:javascript
复制
import sympy as sym
import numpy as np
from matplotlib import pyplot as plt

x, y = sym.symbols('x y', nonnegative=True)
exp = x**2

# Plot using a numpy-ready function
x_arr = np.linspace(-2, 2, 100)
exp_func = sym.lambdify(x, exp, 'numpy')
exp_arr = exp_func(x_arr)

plt.plot(x_arr, exp_arr)

PS:我真正的表达式是b_sim (见下面),我想要方程b_sim = -1的图。有了sym.plot_implicit(b_sim + 1, (n,0.225,1.5), (h, -1.1, 1.1)),我就可以看到我不喜欢的线条在传播。按照Oscar的技巧here,我尝试了下面的代码,它给出了roots的一个错误。

代码语言:javascript
复制
from sympy import *

h, nu = symbols('h nu', nonnegative=True) 
b_sim = 1.0*cos(pi*sqrt(1 - h)/(2*nu))*cos(pi*sqrt(h + 1)/(2*nu)) - 1.0*sin(pi*sqrt(1 - h)/(2*nu))*sin(pi*sqrt(h + 1)/(2*nu))/sqrt(1 - h**2)

eq = Eq(b_sim + 1, 0) 
sols = roots(eq, h) 
sym.plot(*sols, (nu, 0.225, 1.5), ylim=(-1.1, 1.1))
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-11-05 10:35:01

plot_implicit的线宽是由自适应算法引起的。如果设置选项adaptive=False,则绘图模块将使用meshgrid方法。然而,由于实现,这个数字可能不会很好(过多的“分段”)。

使用Numpy和Matplotlib可以这样做:

代码语言:javascript
复制
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
import numpy as np

expr = eq.rewrite(Add)
f = lambdify([nu, h], expr)
n = 2000j
nnu, hh = np.mgrid[0.225:1.5:n, -1.1:1.1:n]
res = f(nnu, hh)

plt.figure()
cmap = ListedColormap(["tab:blue", "tab:blue"])
plt.contour(nnu, hh, res, levels=[0], cmap=cmap)
plt.show()

票数 2
EN

Stack Overflow用户

发布于 2022-11-05 11:19:32

要访问渐变函数图的绘图值,在这种情况下,lines2d图的坐标很简单。

下面是绘制函数的代码。

代码语言:javascript
复制
import matplotlib.pyplot as plt
from sympy import symbols
import numpy as np
import sympy

x, y = symbols('x y', nonnegative=True)
exp = x**2

# Plot using a numpy-ready function
x_arr = np.linspace(-2, 2, 10)  #small number for demo
exp_func = sympy.lambdify(x, exp, 'numpy')
exp_arr = exp_func(x_arr)

plt.figure(figsize=(4, 3))
lines2d = plt.plot(x_arr, exp_arr)

在上面的代码中,lines2d是line2d对象的列表。要从第一个坐标(本例中只有一个坐标)获取坐标,请执行以下操作:

代码语言:javascript
复制
xys = lines2d[0].get_xydata()

你可以用它来绘制这个代码:-

代码语言:javascript
复制
fig = plt.figure(figsize=(4, 3))
ax = fig.add_subplot()
ax.plot(xys[:,0], xys[:,1])
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74326562

复制
相关文章

相似问题

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