numpy 用Matplotlib绘制Sympy隐函数

ldioqlga  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(239)

我有一个隐式函数,比如x**2 - y = 0(为了简化),我想要获得某个x值范围的曲线图。
sympy.plot_implicit通常会给出一些我不满意的线条。
我希望能够访问绘制的值,因此pyplot.plot比我更可取。我通常使用以下代码来绘制显式的sympy函数,但我不确定如何对exp = sym.Eq(x**2 - y, 0)使用类似的代码。有谁有解决这个问题的办法吗?

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 Benjami的提示here,我尝试了以下一段代码,它给出了roots的错误。

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))
5kgi1eie

5kgi1eie1#

plot_implicit的线扩展是由自适应算法引起的。如果设置选项adaptive=False,则绘图模块将使用网格方法。然而,由于实现的原因,这个数字可能不会很好(太多的“分割”)。
以下是使用Numpy和Matplotlib的方法:

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()

ippsafx7

ippsafx72#

要访问渐近函数图的绘图值,在本例中是lines2d图的坐标,这很简单。
下面是绘制该函数的代码。

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对象的列表。要从第一个获得坐标(在本例中只有一个),请执行以下操作:

xys = lines2d[0].get_xydata()

您可以使用它通过以下代码进行打印:-

fig = plt.figure(figsize=(4, 3))
ax = fig.add_subplot()
ax.plot(xys[:,0], xys[:,1])

相关问题