首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SymPy lambdify引发OverflowError:数学范围错误

SymPy lambdify引发OverflowError:数学范围错误
EN

Stack Overflow用户
提问于 2014-09-11 04:48:59
回答 1查看 267关注 0票数 2

所以,我有这个密码

代码语言:javascript
复制
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的一个函数。所以我知道一些选择

代码语言:javascript
复制
z_lambdify = lambdify(w, l)
z_subs = lambda x: l.subs(w, x)

第一个函数给出一个错误。

代码语言:javascript
复制
>>> 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

第二个给出答案

代码语言:javascript
复制
>>> z_subs(1)
11469.9130597554
>>> z_subs(4)
40.8626952786003

我只想用这个,但它很慢。有什么方法可以解决这个问题(修复lamdify错误或使用l作为一个不太慢的函数)?

版本:Python2.7.6,NumPy 1.8.1,SymPy 0.7.4.1

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-11 06:07:28

回答你的问题:

问题是:

代码语言:javascript
复制
z_lambdify = lambdify(w, l)

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

代码语言:javascript
复制
 z_lambdify = lambdify(w, l, "sympy")

重要建议:

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

代码语言:javascript
复制
f = lambda k, w: np.log(k - w) + (k - w)**5

这样你就可以得到你想要的答案:

代码语言:javascript
复制
f(k=u, w=1).sum()

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25779297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档