'ImmutableDenseNDimArray' - 无法绘制方程式

'ImmutableDenseNDimArray' - Can't get equation to plot

我正在尝试绘制方程式,但由于上述错误,我似乎做不到。

这是代码片段,应该可以独立运行:

import numpy as np
from numpy import linspace
from sympy import *
import matplotlib.pyplot as plt

x , t = symbols('x t')

test = simplify(-(0.02631027*sin(3*x)+0.1594*cos(3*x))*exp(-1*x))
test_f = lambdify([x], test, modules="sympy")

# Creating vectors X and Y
x_num = np.linspace(0, 8, 10)

# Plot size
fig = plt.figure(figsize = (16, 7))

# Create the plot
plt.plot(x_num, test_f(x_num))  ← Error at this line!

plt.grid(alpha=.4,linestyle='--')
plt.legend()
plt.show()

在上面提到的那一行,我得到了那个错误。

我应该怎么做?

您将 numpy 与 sympy 混合使用,这就是导致问题的原因。

我们来分析一下代码。在这里创建一个符号表达式:

test = simplify(-(0.02631027*sin(3*x)+0.1594*cos(3*x))*exp(-1*x))

您在这里创建了一个 lambda 函数,要求它由 sympy 求值。这意味着该函数将接受符号值和 returns 符号值:

test_f = lambdify([x], test, modules="sympy")

然后您创建一个 Numpy 数组并将其传递给函数,但它会引发您提到的错误。那是因为该函数需要符号值,或者可以转换为符号值的值。原来 Numpy 数组不能转换为任何符号值!

x_num = np.linspace(0, 8, 10)
test_f(x_num) # ERROR

您需要做的是创建一个 lambda 函数,要求它由 Numpy 计算,如下所示:

test_f = lambdify([x], test)

完整正确代码:

x , t = symbols('x t')

test = simplify(-(0.02631027*sin(3*x)+0.1594*cos(3*x))*exp(-1*x))
test_f = lambdify([x], test)

# Creating vectors X and Y
x_num = np.linspace(0, 8, 10)

# Plot size
fig = plt.figure(figsize = (16, 7))

# Create the plot
plt.plot(x_num, test_f(x_num))

plt.grid(alpha=.4,linestyle='--')
plt.legend()
plt.show()

您的 test_f 产生:

In [113]: test_f(1)
Out[113]: 
                                      -1
(-0.02631027⋅sin(3) - 0.1594⋅cos(3))⋅ℯ  

In [114]: test_f(y)
Out[114]: 
                                          -y
(-0.02631027⋅sin(3⋅y) - 0.1594⋅cos(3⋅y))⋅ℯ  

换句话说,它只是一种生成 sympy 表达式的方法。