使用Horner规则计算Erf函数(不使用阶乘和幂)

时间:2016-10-20 14:31:20

标签: c++ math

虽然我的第一部分使我能够使用阶乘和幂,所以我创建了一些函数原型并使用递归函数来获得错误函数如下:

double erf(double x, int N)
{
if (N < 0) return 0;

return 1.128379167*(power(-1,N)*power(x,2*N+1))/((2*N+1)*fact(N))+erf(x, N-1); 
}

问题在于第二部分需要我使用Horner的规则,而a1,a2,a3 ...... a(n)包括阶乘函数。那么我应该怎么做才能将阶乘函数改成其他东西,所以我可以使用递归函数来计算erf而不使用阶乘。

Horner's rule

Error function

1 个答案:

答案 0 :(得分:0)

您可以将前向和简化为

res = 1;
term = 1;
for(k=1; k<=N; k++) {
    term *= -x*x/k;
    res += term/(2*k+1);
}
return 1.128379167*x*res;

对于像Horner这样的实现,首先考虑内部和的一个例子(即没有公因子1.128379167*x

1 - x^2/1!/3 + x^4/2!/5 - x^6/3!/7

= 1 - x^2 * (1/3 - x^2/2 * (1/5 - x^2/3 * (1/7 - ...) ) )

因此

innersum(x,k,N) {
    if(k>N) return 0;
    return 1/(2*k+1)-x*x/(k+1)*innersum(x,k-1,N);
}

erf(x,N) {
    return 1.128379167*x*innersum(x,0,N);
}