在Python中绘制具有多个变量的符号函数

时间:2018-11-25 18:56:06

标签: python numpy matplotlib sympy

第一个代码单元格:

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',但是我不确定如何纠正它,即使这根本就是问题。任何帮助将不胜感激。

1 个答案:

答案 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))

输出:

enter image description here

似乎潜在的问题是使用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项。