Python SymPy lambdify引发溢出错误:数学范围错误

Python SymPy lambdify引发溢出错误:数学范围错误,python,numpy,lambda,overflow,sympy,Python,Numpy,Lambda,Overflow,Sympy,所以,我有这个代码 from __future__ import division, print_function import sympy as sp import numpy as np from sympy.utilities.lambdify import * u = np.random.uniform(4, 6, 500) w, k = sp.symbols('w k') f = sp.log((k - w) * sp.exp((k - w)**5)) l = sum(f.subs(

所以,我有这个代码

from __future__ import division, print_function
import sympy as sp
import numpy as np
from sympy.utilities.lambdify import *

u = np.random.uniform(4, 6, 500)
w, k = sp.symbols('w k')
f = sp.log((k - w) * sp.exp((k - w)**5))
l = sum(f.subs(dict(k=k)) for k in u)
现在我想使用
l
作为
w
的函数。所以我知道一些选择

z_lambdify = lambdify(w, l)
z_subs = lambda x: l.subs(w, x)
第一个函数给出一个错误

>>> z_lambdify(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in <lambda>
OverflowError: math range error
>>> z_lambdify(4)
40.862695278600114
我只想用这个,但速度很慢。有没有办法解决这个问题(修复lamdify错误或使用
l
作为一个不太慢的函数)

版本:Python 2.7.6、NumPy 1.8.1、SymPy 0.7.4.1

回答您的问题: 问题在于:

z_lambdify = lambdify(w, l)
告诉新函数使用内置的
math
函数执行计算,您可以使用
cProfile.run('z_lambdify(1)')
检查该函数的运行情况;执行
z_subs(1)
调用
sympy
函数时。要获得相同的行为,您应该告诉
lambdify()
使用相同的模块:

 z_lambdify = lambdify(w, l, "sympy")

重要建议: 您应该简化已经定义好的函数,然后使用
NumPy
更有效地执行计算。使用一些简单的代数,可以将函数改写为“非溢出”格式,如下所示:

f = lambda k, w: np.log(k - w) + (k - w)**5
这样,您就可以通过以下方式获得所需的答案:

f(k=u, w=1).sum()

当您执行
f(k=u,w=1)
时,您会得到一个具有相同形状
u
的数组,其中每个值表示使用
u
的每个值计算的函数的结果。您可以使用此函数同时计算
f()
k
w
的不同值,即将
w
作为另一个具有相同形状
u
的数组传递,而不是使用常量值。

谢谢!建议:我不是用f,而是用二阶和三阶导数,这使辛相图更容易。此外,使用numpy.log有时会给出-inf,而sympy.log则给出一个数字。@Mauricio好吧,请记住numpy的强大功能,并且可以重新排列某些函数以避免溢出(例如,
inf
值)。。。也。。。记住,你可以投票给你喜欢的答案…非常忘记投票!而且我更喜欢NumPy…一旦我完成我的程序,我将研究如何避免溢出。谢谢
f(k=u, w=1).sum()