get_points 当使用奇点函数时

时间:2021-04-28 17:25:51

标签: python matplotlib sympy

我想在一张图中绘制来自 sympy 的多个函数,但具有 matplotlib 的功能。 (所以我可以做图例等)有一个帖子 here 展示了如何做到这一点。当情节包含类似 Heaviside() 的内容时,我的问题就出现了。

这里我定义了三个不同的函数来绘制:

from sympy import *
x = symbols('x')

a = x
b = x*(x-1/2)
c = x*Heaviside(x-1/2)

我可以像这样用 a 绘制 bmatplotlib

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)

这在一张图上显示了两个图。但是如果我尝试绘制 ac,它不起作用。

line3, line4 = plot((a,(x,0,)),(c,(x,0,)), show = False)
x4, y4 = line4.get_points()

这会因错误 AttributeError: 'ImmutableDenseNDimArray' object has no attribute 'as_coefficient'

而崩溃

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您可以使用 sympy 的 Lambdify() 将 sympy 函数转换为 numpy 函数。然后使用 matplotlib 进行所有绘图。 Lambdify() 似乎不知道 HeavisideLambdify 也在 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()

sympy with Heaviside and matplotlib plotting

相关问题