【发布时间】:2017-03-20 22:34:04
【问题描述】:
在数学中,Taylor series 对于使用小次数多项式获得函数的近似值很重要。
我想看看这样的近似值有何帮助,例如为了加快计算速度。让我们使用著名的泰勒级数:
log(1+x) = x + 0.5 * x^2 + (error term)
从道德上讲,计算 2 次多项式的值应该比计算 log 快得多。
因此有一个代码来测试这个:
import numpy, time
def f(t):
return t + 0.5 * t ** 2
f = numpy.vectorize(f)
s = time.time()
for i in range(100):
x = numpy.random.rand(100000)
numpy.log(1 + x)
print time.time() - s # 0.556999921799 seconds
s = time.time()
for i in range(100):
x = numpy.random.rand(100000)
f(x)
print time.time() - s # arghh! 4.81500005722 seconds
为什么多项式法比实际对数慢10倍?我的预期正好相反。
PS:这道题大概在SO和math.SE中间。
【问题讨论】:
-
你看过 numpy 是如何计算日志的吗? numpy 的 log() 本身很有可能已经优化了
-
使用
numpy.log(1 + x),您正在使用以实际矢量化方式运行的 NumPy 数组编程,而使用 np.vectorize 作为doc 状态:"The vectorize function is provided primarily for convenience, not for performance"。因此,等效的方法是在替换f(x)时直接使用x:x + 0.5 * x ** 2。 -
泰勒级数对于远离展开点的参数会有收敛问题。这适用于所有推断。
-
@duffymo 好吧,这对于所有的推断都是不正确的。多项式在任何时候都非常接近“足够长”的泰勒展开式。
-
通过霍纳规则计算多项式几乎总是更好。在你的情况下 t*(1.0+0.5*t)。您使用了幂运算符 **,这可能会很慢。
标签: python numpy math scipy taylor-series