sympy分段函数的lambdification计算每个表达式

2024-06-06 19:49:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我把一个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的表达式。有办法吗?在


Tags: 函数numpytrue表达式libusrdistsympy
1条回答
网友
1楼 · 发布于 2024-06-06 19:49:56

NumPy code printer used by lambdifyPiecewise转换为

numpy.select(conditions, expressions, default=numpy.nan)

这意味着数组expressionsnumpy.select选择该数组的一个元素之前,对其进行完整的计算。一些绕过它的方法是:

1)将后端更改为math(或mpmath,或{}以外的任何内容),这将导致Piecewise转换为nested if statement。在

^{pr2}$

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

相关问题 更多 >