使用Sympy方程进行绘图

20
什么是创建Sympy方程的最佳方法?例如,进行求导并绘制该方程结果的方式是什么?
我有我的符号方程,但无法想出如何创建用于绘图的值数组。以下是我的代码:
from sympy import symbols
import matplotlib.pyplot as mpl

t = symbols('t')
x = 0.05*t + 0.2/((t - 5)**2 + 2)

nums = []
for i in range(1000):
    nums.append(t)
    t += 0.02

plotted = [x for t in nums]

mpl.plot(plotted)
mpl.ylabel("Speed")
mpl.show()

在我的情况下,我只是计算了该方程的导数,现在我想绘制速度x,因此这相当简化。
2个回答

31
你可以使用 numpy.linspace() 来创建 x 轴的值(下面代码中的 x_vals),以及 lambdify()
from sympy import symbols
from numpy import linspace
from sympy import lambdify
import matplotlib.pyplot as mpl

t = symbols('t')
x = 0.05*t + 0.2/((t - 5)**2 + 2)
lam_x = lambdify(t, x, modules=['numpy'])

x_vals = linspace(0, 10, 100)
y_vals = lam_x(x_vals)

mpl.plot(x_vals, y_vals)
mpl.ylabel("Speed")
mpl.show()

(由asmeurerMaxNoe建议的改进)

enter image description here

或者,您可以使用sympy的plot()函数:

from sympy import symbols
from sympy import plot

t = symbols('t')
x = 0.05*t + 0.2/((t - 5)**2 + 2)

plot(x, (t, 0, 10), ylabel='Speed')

2
最好使用lambdify从sympy表达式创建一个numpy友好的表达式,而不是使用subs。 - asmeurer
1
如果你使用 lambdify(t, x, modules=['numpy'])y_vals = lam_x(x_vals),它会更快。 - MaxNoe
@asmeurer,使用lambdify()而不是我低效的列表推导式和subs(),使得速度快了4倍。 - user
@MaxNoe 我的测试显示速度提高了约1-10%,感觉相当小。不过我还是会包含它,因为我猜在其他情况下可能会有更显著的影响。 - user
1
对于简单的函数和少量点,增加可能很小,但对于更复杂的东西和更多的点就不是这样了。 - MaxNoe

9

使用SymPy

您可以直接使用SymPy的绘图函数

from sympy import symbols
from sympy.plotting import plot as symplot

t = symbols('t')
x = 0.05*t + 0.2/((t - 5)**2 + 2)
symplot(x)

enter image description here

大部分时间它使用matplotlib作为后端。


如何将其扩展为两个变量的函数?使用f(x,y)代替f(x)。 - baxx
1
@baxx 这是另一个问题,你应该在另一个线程中提问,不过你可以使用 plot implicit https://docs.sympy.org/latest/modules/plotting.html。 - G M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接