【发布时间】:2018-12-14 08:43:58
【问题描述】:
我正在尝试实现“F.卷积方法”(第 2.2 节):
来自Fast algorithms for Taylor shifts and certain difference equations(在底部,或here):
from math import factorial
def convolve(f, h):
g = [0] * (len(f) + len(h) - 1)
for hindex, hval in enumerate(h):
for findex, fval in enumerate(f):
g[hindex + findex] += fval * hval
return g
def shift(f, a):
n = len(f) - 1
u = [factorial(i)*c for i, c in enumerate(f)]
v = [factorial(n)*a**i//factorial(n-i) for i in range(n + 1)]
g = convolve(u, v)
g = [c//(factorial(n)*factorial(i)) for i, c in enumerate(g)]
return g
f = [1, 2, 3, -4, 5, 6, -7, 8, 9]
print(shift(f, 1))
但我只得到零,而正确的结果应该是:
[1, 10, 45, 112, 170, 172, 116, 52, 23]
请问,有谁知道我在这里做错了什么?
【问题讨论】:
-
在此处发布算法以便于帮助。就目前而言,您将小整数除以大整数(这就是 0 的原因),因此我们必须了解您期望
convolve(u,v)返回的内容。 -
@kabanus 完成...
-
你确定这是正确的输出吗,来自 isaac97 中的 (2)(以及我对 2.2(F) 的实现,我得到
{0: 23, 1: 132, 2: 396, 3: 720, 4: 840, 5: 636, 6: 301, 7: 80, 8: 9}) -
@jedwards 得到的也是我修复代码后得到的(见下文,颠倒过来)。仔细检查。
-
@EcirHana 我两个都加了,但是基本上是 kabanus'(并且使用了
defaultdict,这样我就可以将所有的索引杂耍缠绕起来)。由于 kabanus 的回答很好地解释了您原始代码中的问题,我的基本上就是您要求的代码。
标签: python algorithm math polynomials taylor-series