如何解决get_points 当使用奇点函数时
我想在一张图中绘制来自 sympy
的多个函数,但具有 matplotlib
的功能。 (所以我可以做图例等)有一个帖子 here 展示了如何做到这一点。当情节包含类似 Heaviside()
的内容时,我的问题就出现了。
这里我定义了三个不同的函数来绘制:
from sympy import *
x = symbols('x')
a = x
b = x*(x-1/2)
c = x*Heaviside(x-1/2)
我可以像这样用 a
绘制 b
和 matplotlib
:
line1,line2 = plot((a,(x,1)),(b,show = False)
x1,y1 = line1.get_points()
x2,y2 = line2.get_points()
plt.plot(x1,y1)
plt.plot(x2,y2)
这在一张图上显示了两个图。但是如果我尝试绘制 a
和 c
,它不起作用。
line3,line4 = plot((a,)),(c,show = False)
x4,y4 = line4.get_points()
这会因错误 AttributeError: 'ImmutableDenseNDimArray' object has no attribute 'as_coefficient'
有什么想法吗?
解决方法
您可以使用 sympy 的 Lambdify()
将 sympy 函数转换为 numpy 函数。然后使用 matplotlib 进行所有绘图。 Lambdify()
似乎不知道 Heaviside
(Lambdify
也在 sympy 的绘图内部使用)。提供显式转换规则可以解决该问题。
请注意,from sympy import *
可能会导致令人困惑的错误,尤其是当还涉及 numpy 时,因为许多名称重合。通常最好只导入真正用到的函数。
from sympy import symbols,Heaviside,lambdify,latex
x = symbols('x')
a = x
b = x * (x - 1 / 2)
c = x * Heaviside(x - 1 / 2)
modules = [{'Heaviside': lambda x: np.heaviside(x,1)},'numpy']
a_np = lambdify(x,a,modules=modules)
b_np = lambdify(x,b,modules=modules)
c_np = lambdify(x,c,modules=modules)
import numpy as np
import matplotlib.pyplot as plt
xs = np.linspace(-5,5,200)
plt.plot(xs,a_np(xs),label='$' + latex(a) + '$')
plt.plot(xs,b_np(xs),label='$' + latex(b) + '$')
plt.plot(xs,c_np(xs),label='$' + latex(c) + '$')
plt.legend()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。