Построение символической функции с несколькими переменными в Python - PullRequest
0 голосов
/ 25 ноября 2018

Первая кодовая ячейка:

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 являются переменными, и я долженпостроите функцию для t = 0,1,1 и 10, используя z в качестве моей оси x и p_w (z) в качестве оси y.

Я попытался определить 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 ():

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 не понимает 'exp' так же, как симпй, но я не уверенотносительно того, как исправить это, или даже если это проблема вообще.Любая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 25 ноября 2018

Вы можете заставить это работать, если пропустить шаг 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 препятствует правильному расширению t в p_w.evalf.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...