'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 表达式的方法。
我正在尝试绘制方程式,但由于上述错误,我似乎做不到。
这是代码片段,应该可以独立运行:
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 表达式的方法。