Функция Heaviside должна быть встроена в Sympy и Numpy, но следующий код выдает ошибку Name Heaviside not defined
. Попытка определить саму функцию Хевисайда в коде до того, как числовые вычисления, которые будут использовать ее (на основе трассировки), ничего не сделали - я думаю, это должно быть определено в lambdifygenerated
. Есть ли обходной путь?
from sympy import *
from IPython.display import display
mux, s, Px, Py, Pxe, Pye = symbols("mu_X s P_X P_Y P_X^* P_Y^*", positive=True)
vx, vy, cx, cy = symbols("v_X v_Y c_X c_Y", real=True)
pix = (Px-cx)*( mux*integrate(integrate(1,(vx,Min(1,Max(0,Px+Max(0,vy-Pye-s))),1)),(vy,0,1))
+(1-mux)*integrate(integrate(1,(vx,Min(1,Max(0,Max(Pxe+s,Px)+Max(0,vy-Pye))),1)),(vy,0,1))
)
piy = (Py-cy)*( (1-mux)*integrate(integrate(1,(vy,Min(1,Max(0,Py+Max(0,vx-Pxe-s))),1)),(vx,0,1))
+mux*integrate(integrate(1,(vy,Min(1,Max(0,Max(Pye+s,Py)+Max(0,vx-Pxe))),1)),(vx,0,1))
)
focx =diff(pix,Px)
focy =diff(piy,Py)
focxeq=focx.subs(Px,Pxe)
focyeq=focy.subs(Py,Pye)
import numpy as np
focx_lambda = lambdify((Pxe,Pye), focxeq, modules=['numpy', 'sympy'])
focy_lambda = lambdify((Pxe,Pye), focyeq, modules=['numpy', 'sympy'])
nsolve([focxeq.subs({mux:0.4,s:0.05,cx:0,cy:0.1}).evalf(),focyeq.subs({mux:0.4,s:0.05,cx:0,cy:0.1}).evalf()],(Pxe,Pye),(0.3,0.4))
Трассировка выглядит следующим образом:
--------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-10-b7bc7e96827d> in <module>
26 focx_lambda = lambdify((Pxe,Pye), focxeq, modules=['numpy', 'sympy'])
27 focy_lambda = lambdify((Pxe,Pye), focyeq, modules=['numpy', 'sympy'])
---> 28 nsolve([focxeq.subs({mux:0.4,s:0.05,cx:0,cy:0.1}).evalf(),focyeq.subs({mux:0.4,s:0.05,cx:0,cy:0.1}).evalf()],(Pxe,Pye),(0.3,0.4))
29 mux=0.4
30 s=0.05
~/anaconda3/lib/python3.6/site-packages/sympy/utilities/decorator.py in func_wrapper(*args, **kwargs)
88 dps = mpmath.mp.dps
89 try:
---> 90 return func(*args, **kwargs)
91 finally:
92 mpmath.mp.dps = dps
~/anaconda3/lib/python3.6/site-packages/sympy/solvers/solvers.py in nsolve(*args, **kwargs)
3045 J = lambdify(fargs, J, modules)
3046 # solve the system numerically
-> 3047 x = findroot(f, x0, J=J, **kwargs)
3048 if as_dict:
3049 return [dict(zip(fargs, [sympify(xi) for xi in x]))]
~/anaconda3/lib/python3.6/site-packages/mpmath/calculus/optimization.py in findroot(ctx, f, x0, solver, tol, verbose, verify, **kwargs)
926 # detect multidimensional functions
927 try:
--> 928 fx = f(*x0)
929 multidimensional = isinstance(fx, (list, tuple, ctx.matrix))
930 except TypeError:
<lambdifygenerated-23> in _lambdifygenerated(Dummy_4515, _Dummy_4514)
1 def _lambdifygenerated(Dummy_4515, _Dummy_4514):
----> 2 return (ImmutableDenseMatrix([[Dummy_4515*(mpf((0, 3602879701896397, -53, 52))*((-(_Dummy_4514 - Dummy_4515 + mpf((0, 4728779608739021, -52, 53)))*Heaviside(1 - Dummy_4515)*Heaviside(1 - Max(_Dummy_4514 + mpf((0, 3602879701896397, -56, 52)), _Dummy_4514 - Dummy_4515 + mpf((0, 4728779608739021, -52, 53)))) + Heaviside(1 - Dummy_4515)*Heaviside(1 - Max(_Dummy_4514 + mpf((0, 3602879701896397, -56, 52)), _Dummy_4514 - Dummy_4515 + mpf((0, 4728779608739021, -52, 53))))*Min(mpf((0, 1, 0, 1)), Max(_Dummy_4514 + mpf((0, 3602879701896397, -56, 52)), _Dummy_4514 - Dummy_4515 + mpf((0, 4728779608739021, -52, 53)))) + Min(mpf((0, 1, 0, 1)), _Dummy_4514 + mpf((0, 3602879701896397, -56, 52))) - Min(mpf((0, 1, 0, 1)), Max(_Dummy_4514 + mpf((0, 3602879701896397, -56, 52)), _Dummy_4514 - Dummy_4515 + mpf((0, 4728779608739021, -52, 53))))) if (Dummy_4515 >= 1) else (-(_Dummy_4514 - Dummy_4515 + mpf((0, 4728779608739021, -52, 53)))*Heaviside(1 - Dummy_4515)*Heaviside(1 - Max(_Dummy_4514 + mpf((0, 3602879701896397, -56, 52)), _Dummy_4514 - Dummy_4515 + mpf((0, 4728779608739021, -52, 53)))) + Heaviside(1 - Dummy_4515)*Heaviside(1 - Max(_Dummy_4514 + mpf((0, 3602879701896397, -56, 52)), _Dummy_4514 - Dummy_4515 + mpf((0, 4728779608739021, -52, 53))))*Min(mpf((0, 1, 0, 1)), Max(_Dummy_4514 + mpf((0, 3602879701896397, -56, 52)), _Dummy_4514 - Dummy_4515 + mpf((0, 4728779608739021, -52, 53)))) - Min(mpf((0, 1, 0, 1)), Max(_Dummy_4514 + mpf((0, 3602879701896397, -56, 52)), _Dummy_4514 - Dummy_4515 + mpf((0, 4728779608739021, -52, 53)))))) + mpf((0, 5404319552844595, -53, 53))*((0) if (Dummy_4515 >= mpf((0, 4278419646001971, -52, 52))) else (-(_Dummy_4514 - Dummy_4515 + mpf((0, 4278419646001971, -52, 52)))*Heaviside(1 - Max(_Dummy_4514, _Dummy_4514 - Dummy_4515 + 1))*Heaviside(_Dummy_4514 - Dummy_4515 - Max(_Dummy_4514, _Dummy_4514 - Dummy_4515 + mpf((0, 4278419646001971, -52, 52))) + 1) + Heaviside(1 - Max(_Dummy_4514, _Dummy_4514 - Dummy_4515 + 1))*Heaviside(_Dummy_4514 - Dummy_4515 - Max(_Dummy_4514, _Dummy_4514 - Dummy_4515 + mpf((0, 4278419646001971, -52, 52))) + 1)*Min(mpf((0, 1, 0, 1)), Max(_Dummy_4514, _Dummy_4514 - Dummy_4515 + mpf((0, 1, 0, 1))))) if (Dummy_4515 >= 1) else (0))) + mpf((0, 3602879701896397, -53, 52))*((-(_Dummy_4514 - Dummy_4515 + mpf((0, 4728779608739021, -52, 53)))*Min(mpf((0, 1, 0, 1)), _Dummy_4514 + mpf((0, 3602879701896397, -56, 52))) + (_Dummy_4514 - Dummy_4515 + mpf((0, 4728779608739021, -52, 53)))*Min(mpf((0, 1, 0, 1)), Max(_Dummy_4514 + mpf((0, 3602879701896397, -56, 52)), _Dummy_4514 - Dummy_4515 + mpf((0, 4728779608739021, -52, 53)))) + mpf((0, 1, -1, 1))*Min(mpf((0, 1, 0, 1)), _Dummy_4514 + mpf((0, 3602879701896397, -56, 52)))**2 - mpf((0, 1, -1, 1))*Min(mpf((0, 1, 0, 1)), Max(_Dummy_4514 + mpf((0, 3602879701896397, -56, 52)), _Dummy_4514 - Dummy_4515 + mpf((0, 4728779608739021, -52, 53))))**2) if (Dummy_4515 >= 1) else ((mpf((0, 1, 0, 1)) - Dummy_4515)*Min(mpf((0, 1, 0, 1)), _Dummy_4514 + mpf((0, 3602879701896397, -56, 52))) - (_Dummy_4514 - Dummy_4515 + mpf((0, 4728779608739021, -52, 53)))*Min(mpf((0, 1, 0, 1)), _Dummy_4514 + mpf((0, 3602879701896397, -56, 52))) + (_Dummy_4514 - Dummy_4515 + mpf((0, 4728779608739021, -52, 53)))*Min(mpf((0, 1, 0, 1)), Max(_Dummy_4514 + mpf((0, 3602879701896397, -56, 52)), _Dummy_4514 - Dummy_4515 + mpf((0, 4728779608739021, -52, 53)))) + mpf((0, 1, -1, 1))*Min(mpf((0, 1, 0, 1)), _Dummy_4514 + mpf((0, 3602879701896397, -56, 52)))**2 - mpf((0, 1, -1, 1))*Min(mpf((0, 1, 0, 1)), Max(_Dummy_4514 + mpf((0, 3602879701896397, -56, 52)), _Dummy_4514 - Dummy_4515 + mpf((0, 4728779608739021, -52, 53))))**2)) + mpf((0, 5404319552844595, -53, 53))*((-(_Dummy_4514 - Dummy_4515 + mpf((0, 4278419646001971, -52, 52)))*Min(mpf((0, 1, 0, 1)), _Dummy_4514) + (_Dummy_4514 - Dummy_4515 + mpf((0, 4278419646001971, -52, 52)))*Min(mpf((0, 1, 0, 1)), Max(_Dummy_4514, _Dummy_4514 - Dummy_4515 + mpf((0, 4278419646001971, -52, 52)))) + mpf((0, 1, -1, 1))*Min(mpf((0, 1, 0, 1)), _Dummy_4514)**2 - mpf((0, 1, -1, 1))*Min(mpf((0, 1, 0, 1)), Max(_Dummy_4514, _Dummy_4514 - Dummy_4515 + mpf((0, 4278419646001971, -52, 52))))**2) if (Dummy_4515 >= mpf((0, 4278419646001971, -52, 52))) else (-(_Dummy_4514 - Dummy_4515 + mpf((0, 4278419646001971, -52, 52)))*Min(mpf((0, 1, 0, 1)), _Dummy_4514) + (_Dummy_4514 - Dummy_4515 + mpf((0, 4278419646001971, -52, 52)))*Min(mpf((0, 1, 0, 1)), Max(_Dummy_4514, _Dummy_4514 - Dummy_4515 + mpf((0, 1, 0, 1)))) + mpf((0, 1, -1, 1))*Min(mpf((0, 1, 0, 1)), _Dummy_4514)**2 - mpf((0, 1, -1, 1))*Min(mpf((0, 1, 0, 1)), Max(_Dummy_4514, _Dummy_4514 - Dummy_4515 + mpf((0, 1, 0, 1))))**2) if (Dummy_4515 >= 1) else ((mpf((0, 4278419646001971, -52, 52)) - Dummy_4515)*Min(mpf((0, 1, 0, 1)), _Dummy_4514) - (_Dummy_4514 - Dummy_4515 + mpf((0, 4278419646001971, -52, 52)))*Min(mpf((0, 1, 0, 1)), _Dummy_4514) + (_Dummy_4514 - Dummy_4515 + mpf((0, 4278419646001971, -52, 52)))*Min(mpf((0, 1, 0, 1)), Max(_Dummy_4514, _Dummy_4514 - Dummy_4515 + mpf((0, 4278419646001971, -52, 52)))) + mpf((0, 1, -1, 1))*Min(mpf((0, 1, 0, 1)), _Dummy_4514)**2 - mpf((0, 1, -1, 1))*Min(mpf((0, 1, 0, 1)), Max(_Dummy_4514, _Dummy_4514 - Dummy_4515 + mpf((0, 4278419646001971, -52, 52))))**2))], [(_Dummy_4514 + mpf((1, 3602879701896397, -55, 52)))*(mpf((0, 5404319552844595, -53, 53))*((-(-_Dummy_4514 + Dummy_4515 + mpf((0, 4728779608739021, -52, 53)))*Heaviside(1 - _Dummy_4514)*Heaviside(1 - Max(Dummy_4515 + mpf((0, 3602879701896397, -56, 52)), -_Dummy_4514 + Dummy_4515 + mpf((0, 4728779608739021, -52, 53)))) + Heaviside(1 - _Dummy_4514)*Heaviside(1 - Max(Dummy_4515 + mpf((0, 3602879701896397, -56, 52)), -_Dummy_4514 + Dummy_4515 + mpf((0, 4728779608739021, -52, 53))))*Min(mpf((0, 1, 0, 1)), Max(Dummy_4515 + mpf((0, 3602879701896397, -56, 52)), -_Dummy_4514 + Dummy_4515 + mpf((0, 4728779608739021, -52, 53)))) + Min(mpf((0, 1, 0, 1)), Dummy_4515 + mpf((0, 3602879701896397, -56, 52))) - Min(mpf((0, 1, 0, 1)), Max(Dummy_4515 + mpf((0, 3602879701896397, -56, 52)), -_Dummy_4514 + Dummy_4515 + mpf((0, 4728779608739021, -52, 53))))) if (_Dummy_4514 >= 1) else (-(-_Dummy_4514 + Dummy_4515 + mpf((0, 4728779608739021, -52, 53)))*Heaviside(1 - _Dummy_4514)*Heaviside(1 - Max(Dummy_4515 + mpf((0, 3602879701896397, -56, 52)), -_Dummy_4514 + Dummy_4515 + mpf((0, 4728779608739021, -52, 53)))) + Heaviside(1 - _Dummy_4514)*Heaviside(1 - Max(Dummy_4515 + mpf((0, 3602879701896397, -56, 52)), -_Dummy_4514 + Dummy_4515 + mpf((0, 4728779608739021, -52, 53))))*Min(mpf((0, 1, 0, 1)), Max(Dummy_4515 + mpf((0, 3602879701896397, -56, 52)), -_Dummy_4514 + Dummy_4515 + mpf((0, 4728779608739021, -52, 53)))) - Min(mpf((0, 1, 0, 1)), Max(Dummy_4515 + mpf((0, 3602879701896397, -56, 52)), -_Dummy_4514 + Dummy_4515 + mpf((0, 4728779608739021, -52, 53)))))) + mpf((0, 3602879701896397, -53, 52))*((0) if (_Dummy_4514 >= mpf((0, 4278419646001971, -52, 52))) else (-(-_Dummy_4514 + Dummy_4515 + mpf((0, 4278419646001971, -52, 52)))*Heaviside(1 - Max(Dummy_4515, -_Dummy_4514 + Dummy_4515 + 1))*Heaviside(-_Dummy_4514 + Dummy_4515 - Max(Dummy_4515, -_Dummy_4514 + Dummy_4515 + mpf((0, 4278419646001971, -52, 52))) + 1) + Heaviside(1 - Max(Dummy_4515, -_Dummy_4514 + Dummy_4515 + 1))*Heaviside(-_Dummy_4514 + Dummy_4515 - Max(Dummy_4515, -_Dummy_4514 + Dummy_4515 + mpf((0, 4278419646001971, -52, 52))) + 1)*Min(mpf((0, 1, 0, 1)), Max(Dummy_4515, -_Dummy_4514 + Dummy_4515 + mpf((0, 1, 0, 1))))) if (_Dummy_4514 >= 1) else (0))) + mpf((0, 5404319552844595, -53, 53))*((-(-_Dummy_4514 + Dummy_4515 + mpf((0, 4728779608739021, -52, 53)))*Min(mpf((0, 1, 0, 1)), Dummy_4515 + mpf((0, 3602879701896397, -56, 52))) + (-_Dummy_4514 + Dummy_4515 + mpf((0, 4728779608739021, -52, 53)))*Min(mpf((0, 1, 0, 1)), Max(Dummy_4515 + mpf((0, 3602879701896397, -56, 52)), -_Dummy_4514 + Dummy_4515 + mpf((0, 4728779608739021, -52, 53)))) + mpf((0, 1, -1, 1))*Min(mpf((0, 1, 0, 1)), Dummy_4515 + mpf((0, 3602879701896397, -56, 52)))**2 - mpf((0, 1, -1, 1))*Min(mpf((0, 1, 0, 1)), Max(Dummy_4515 + mpf((0, 3602879701896397, -56, 52)), -_Dummy_4514 + Dummy_4515 + mpf((0, 4728779608739021, -52, 53))))**2) if (_Dummy_4514 >= 1) else ((mpf((0, 1, 0, 1)) - _Dummy_4514)*Min(mpf((0, 1, 0, 1)), Dummy_4515 + mpf((0, 3602879701896397, -56, 52))) - (-_Dummy_4514 + Dummy_4515 + mpf((0, 4728779608739021, -52, 53)))*Min(mpf((0, 1, 0, 1)), Dummy_4515 + mpf((0, 3602879701896397, -56, 52))) + (-_Dummy_4514 + Dummy_4515 + mpf((0, 4728779608739021, -52, 53)))*Min(mpf((0, 1, 0, 1)), Max(Dummy_4515 + mpf((0, 3602879701896397, -56, 52)), -_Dummy_4514 + Dummy_4515 + mpf((0, 4728779608739021, -52, 53)))) + mpf((0, 1, -1, 1))*Min(mpf((0, 1, 0, 1)), Dummy_4515 + mpf((0, 3602879701896397, -56, 52)))**2 - mpf((0, 1, -1, 1))*Min(mpf((0, 1, 0, 1)), Max(Dummy_4515 + mpf((0, 3602879701896397, -56, 52)), -_Dummy_4514 + Dummy_4515 + mpf((0, 4728779608739021, -52, 53))))**2)) + mpf((0, 3602879701896397, -53, 52))*((-(-_Dummy_4514 + Dummy_4515 + mpf((0, 4278419646001971, -52, 52)))*Min(mpf((0, 1, 0, 1)), Dummy_4515) + (-_Dummy_4514 + Dummy_4515 + mpf((0, 4278419646001971, -52, 52)))*Min(mpf((0, 1, 0, 1)), Max(Dummy_4515, -_Dummy_4514 + Dummy_4515 + mpf((0, 4278419646001971, -52, 52)))) + mpf((0, 1, -1, 1))*Min(mpf((0, 1, 0, 1)), Dummy_4515)**2 - mpf((0, 1, -1, 1))*Min(mpf((0, 1, 0, 1)), Max(Dummy_4515, -_Dummy_4514 + Dummy_4515 + mpf((0, 4278419646001971, -52, 52))))**2) if (_Dummy_4514 >= mpf((0, 4278419646001971, -52, 52))) else (-(-_Dummy_4514 + Dummy_4515 + mpf((0, 4278419646001971, -52, 52)))*Min(mpf((0, 1, 0, 1)), Dummy_4515) + (-_Dummy_4514 + Dummy_4515 + mpf((0, 4278419646001971, -52, 52)))*Min(mpf((0, 1, 0, 1)), Max(Dummy_4515, -_Dummy_4514 + Dummy_4515 + mpf((0, 1, 0, 1)))) + mpf((0, 1, -1, 1))*Min(mpf((0, 1, 0, 1)), Dummy_4515)**2 - mpf((0, 1, -1, 1))*Min(mpf((0, 1, 0, 1)), Max(Dummy_4515, -_Dummy_4514 + Dummy_4515 + mpf((0, 1, 0, 1))))**2) if (_Dummy_4514 >= 1) else ((mpf((0, 4278419646001971, -52, 52)) - _Dummy_4514)*Min(mpf((0, 1, 0, 1)), Dummy_4515) - (-_Dummy_4514 + Dummy_4515 + mpf((0, 4278419646001971, -52, 52)))*Min(mpf((0, 1, 0, 1)), Dummy_4515) + (-_Dummy_4514 + Dummy_4515 + mpf((0, 4278419646001971, -52, 52)))*Min(mpf((0, 1, 0, 1)), Max(Dummy_4515, -_Dummy_4514 + Dummy_4515 + mpf((0, 4278419646001971, -52, 52)))) + mpf((0, 1, -1, 1))*Min(mpf((0, 1, 0, 1)), Dummy_4515)**2 - mpf((0, 1, -1, 1))*Min(mpf((0, 1, 0, 1)), Max(Dummy_4515, -_Dummy_4514 + Dummy_4515 + mpf((0, 4278419646001971, -52, 52))))**2))]]))
NameError: name 'Heaviside' is not defined
Я добавил focx_lambda = lambdify((Pxe,Pye), focxeq, modules=['numpy', 'sympy'])
на основе ответа на (Некоторая функция) не определена с SymPy Lambdify но это ничего не изменило.
То, как я сам определил Хевисайда, было
def Heaviside(x):
if x<0:
out=0
else:
out=1
return out
Я также на всякий случай попробовал from numpy import *
. Это ничего не изменило.