第一个代码单元格:
import numpy as np
import matplotlib.pyplot as plt
import sympy as sym
from ipywidgets.widgets import interact
sym.init_printing(use_latex="mathjax")
x, y, z, t = sym.symbols('x y z t')
我需要绘制以下已定义为的函数:
p_w = (1/sym.sqrt(sym.pi*(1-sym.exp(-2*t))))*sym.exp(-(z-sym.exp(-t))**2/(1-sym.exp(-2*t)))
很显然,t和z都是变量,我将z用作我的x轴,将p_w(z)作为y轴,绘制t = 0.1,1和10的函数。
我尝试定义3个函数j,k,l,其值包含在t中,如下所示:
j=p_w.evalf(subs={t:0.1})
k=p_w.evalf(subs={t:1})
l=p_w.evalf(subs={t:10})
然后使用sym.lambdify()函数将其更改为numpy数组:
j_np=sym.lambdify(z,j)
k_np=sym.lambdify(z,k)
l_np=sym.lambdify(z,l)
我使用以下方法定义了x轴:
myz = np.linspace(0,10,1000)
(1000格相当随意,因为我不确定准确的图表需要多少格)
然后我尝试仅绘制j,如下所示:
plt.plot(myz, j_np(myz))
,并收到以下错误消息:
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-41-d743a8a00bcf> in <module>()
----> 1 plt.plot(myz,j_np(myz))
/anaconda3/lib/python3.6/site-packages/numpy/__init__.py in <lambda>. (_Dummy_164)
AttributeError: 'Mul' object has no attribute 'exp'
我猜测问题是numpy无法像sympy那样理解'exp',但是我不确定如何纠正它,即使这根本就是问题。任何帮助将不胜感激。
答案 0 :(得分:0)
如果跳过evalf
步骤,您可以使它起作用:
import numpy as np
import matplotlib.pyplot as plt
import sympy as sym
from ipywidgets.widgets import interact
sym.init_printing(use_latex="mathjax")
# x, y, z, t = sym.symbols('x y z t')
from sympy.abc import x,y,z,t
p_w = (1/sym.sqrt(sym.pi*(1-sym.exp(-2*t))))*sym.exp(-(z - sym.exp(-t))**2/(1-sym.exp(-2*t)))
myz = np.linspace(0,10,1000)
lam=sym.lambdify((z,t), p_w)
myz = np.linspace(0,10,1000)
times = [.01, 1, 10]
for time in times:
plt.plot(myz, lam(myz, time))
输出:
似乎潜在的问题是使用p_w.evalf(subs={t:0.1})
设置时间并没有真正起作用:
print(p_w.evalf(subs={t:0.1}))
0.564189583547756*(1.0 - exp(-2*t))**(-0.5)*exp(-(z - exp(-t))**2/(1 - exp(-2*t)))
如果从z
中删除了p_w
,它会正常工作:
p_w = (1/sym.sqrt(sym.pi*(1-sym.exp(-2*t))))*sym.exp(-(- sym.exp(-t))**2/(1-sym.exp(-2*t)))
print(p_w.evalf(subs={t:0.1}))
0.0144778612224441
因此,显然z
中有不确定的变量p_w
会阻止p_w.evalf
正确扩展t
项。