我把一个sympy分段函数写成lambdizing,尝试这样做:
f = Piecewise((1,(p > -1e-10) & (p < 1e-10)), (1/p, True))
g = lambdify(p,f,"numpy")
同时
^{pr2}$我明白了
>>> g(0)
/usr/lib/python2.7/dist-packages/numpy/__init__.py:1: RuntimeWarning: divide by zero encountered in true_divide
"""
array(1.0)
看来,(被羔羊咬了吗?)-逐段计算所有表达式,然后返回条件为true的表达式。有办法吗?在
NumPy code printer used by lambdify将
Piecewise
转换为这意味着数组
expressions
在numpy.select
选择该数组的一个元素之前,对其进行完整的计算。一些绕过它的方法是:1)将后端更改为}以外的任何内容),这将导致
^{pr2}$math
(或mpmath
,或{Piecewise
转换为nested if statement。在2)用Max/Min/Abs/sign重写公式,该公式可以表示一些分段函数,且易于lambdique。但在这种情况下不可能
^{3}$完成任务。诀窍是当p不太接近0时,
0.5 * (sign(p + 1e-10) + sign(p - 1e-10))
是符号(p),当p接近0时是0。类似地,0.5 * (sign(p + 1e-10) - sign(p - 1e-10))
如果p不太接近0,则为1,而当p接近0时为0。这些因素导致公式从一种模式切换到另一种模式,分母中的Max
在任何情况下都避免了被零除的错误。在3)Suppress Runtime Warnings
相关问题 更多 >
编程相关推荐