我想在一张图中绘制来自 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,0,1)), (b,(x,0,1)), 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,(x,0,)),(c,(x,0,)), show = False)
x4, y4 = line4.get_points()
这会因错误 AttributeError: 'ImmutableDenseNDimArray' object has no attribute 'as_coefficient'
有什么想法吗?
答案 0 :(得分:0)
您可以使用 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()