【问题标题】:How to convert sympy function to plot with matplotlib?如何将 sympy 函数转换为使用 matplotlib 绘图?
【发布时间】:2017-10-03 17:02:00
【问题描述】:

我有某些函数,例如 sin(b*x),用 sympy 得到导数和反导数表达式,但我需要在 matplotlib 中绘制这 3 个函数。我的问题是我无法将函数正确转换为 numpy 以便在 matplotlib 中绘图。我已经按照 sympy 页面中的文档使用了lambify 函数,但它不起作用。 http://docs.sympy.org/latest/modules/utilities/lambdify.html

我有这个代码:

from sympy import Symbol, diff, integrate, sin, cos, Function
from sympy.utilities.lambdify import lambdify, implemented_function
from sympy.abc import x

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button, RadioButtons

def signal(b,x):
    return sin(b*x)

def derivative(b,x):
    yprime = diff(signal(b,x), x)   
    return yprime

def antiderivative(b,x):
    anti = integrate(signal(b,x), x)
    return anti

b = 5

evalfunc = lambdify((b,x), signal(b,x), modules=['numpy'])
evalderiv = lambdify((b,x), derivative(b,x), modules=['numpy'])
evalantideriv = lambdify((b,x), antiderivative(b,x), modules=['numpy'])

axis_color = 'lightgoldenrodyellow'
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
fig.subplots_adjust(left=0.25, bottom=0.25)
t = np.arange(-10, 10, 0.001)

[line] = ax.plot(t, evalfunc(b,t), linewidth=2, color='red')
[line2] = ax.plot(t, evalderiv(b,t), linewidth=2, color='blue')
[line3] = ax.plot(t, evalantideriv(b,t), linewidth=2, color='blue')
ax.set_xlim([-10, 10])
ax.set_ylim([-5, 5])

ax.grid()
plt.show()

在 ax.plot ValueError 中失败:序列太大;不能大于 32

【问题讨论】:

  • 您的 evalfunc 定义和接下来的两行在 sympy 1.0、mpl 2.0.0、numpy 1.12.1 上引发了我的错误。这是因为您在前一行中将b 设置为一个整数。你运行的是什么版本的?
  • 我正在使用天篷。我有 Numpy 1.11.3-3 mpl 2.0.0-3 sympy 1.0-2。我尝试使用 b like b = Symbol('b') 并得到 AttributeError: 'Mul' object has no attribute 'sin' in ax.plot

标签: python numpy matplotlib plot sympy


【解决方案1】:

您的代码并不是一个最小的工作示例,但它只需要进行最小的更改即可工作。

您需要在推导之前将您的b 声明为真实符号。 你在数值计算前设置为b=5

见:

from sympy import Symbol, diff, integrate, sin, cos, Function
from sympy.utilities.lambdify import lambdify, implemented_function
from sympy.abc import x

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button, RadioButtons

def signal(b,x):
    return sin(b*x)

def derivative(b,x):
    yprime = diff(signal(b,x), x)   
    return yprime

def antiderivative(b,x):
    anti = integrate(signal(b,x), x)
    return anti

b = Symbol('b', real=True)

evalfunc = lambdify((b,x), signal(b,x), modules=['numpy'])
evalderiv = lambdify((b,x), derivative(b,x), modules=['numpy'])
evalantideriv = lambdify((b,x), antiderivative(b,x), modules=['numpy'])

axis_color = 'lightgoldenrodyellow'
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
fig.subplots_adjust(left=0.25, bottom=0.25)
t = np.arange(-10, 10, 0.001)

b = 5

[line] = ax.plot(t, evalfunc(b,t), linewidth=2, color='red')
[line2] = ax.plot(t, evalderiv(b,t), linewidth=2, color='blue')
[line3] = ax.plot(t, evalantideriv(b,t), linewidth=2, color='blue')
ax.set_xlim([-10, 10])
ax.set_ylim([-5, 5])

ax.grid()
plt.show()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 2020-10-04
    相关资源
    最近更新 更多