当我要计算以下系列1+x+x^2+x^3+...
时,我更喜欢这样做:(1+x)(1+x^2)(1+x^4)...
(这类似于某种重复的平方),这样乘法的数量可以显着增加降低。
现在我想计算系列1+x/1!+(x^2)/2!+(x^3)/3!+...
,我如何使用类似的技术来改善乘法次数?
热烈欢迎任何建议!
答案 0 :(得分:4)
你所提到的优化方法可能是霍纳的方法:
a + bx +cx^2 +dx^3 = ((c+dx)x + b)x + a
交替序列A *(1-x)(1 + x ^ 2)(1-x ^ 4)(1 + x ^ 8)... OTOH可用于计算A /(1的除法近似值+ x),其中x很小。
exp(x)的泰勒级数sigma x^n/n!
收敛得很厉害;其他近似值更适合获得准确的值;如果有一个技巧来减少乘法,那就是用一个临时值进行迭代:
sum=1; temp=x; k=1;
// The sum after first iteration is (1+x) or 1+x^1/1!
for (i=1;i<=N;i++) { sum=sum+temp; k=k*(i+1); temp = temp * x / k; }
// or
prod=1.0; for (i=N;i>0;i--) prod = prod * x/(double)i + 1.0;
将阶乘相乘可以稍微提高准确度 - 在实际情况中,为了能够进一步迭代,或者为常量a_n /使用查找表,可能建议组合temp=temp*x/(i+1)
。 n!,因为通常只需要几个术语。 (sin / cos的4或5个术语)。
事实证明,Horner的规则在几何系列Sigma x^n
对产品形式的转换中没有太大作用。要计算指数,必须应用其他强大的技术 - 通常是范围缩减和理性(Pade),多项式(chebyshev)近似等。
答案 1 :(得分:1)
关于第一个系列的方法,你认为使用1 + x(1 + x(1 + x(1 + x)....))不是更好的方法。类似的方法可以应用于第二系列。所以1 + x / 1 (1 + x / 2 (1 + x / 3 *(1 + x / 4(.....))))
答案 2 :(得分:1)
将评论转换为答案:
请注意,对于第一个系列,确切的等价:
1+x+x^2+x^3+...+x^n = (1-x^(n+1))/(1-x)
使用它,你可以更快,更快地计算它。
第二个是e^x
的收敛系列,您可能希望使用标准数学库函数pow(e, x)
或exp(x)
。