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

Calculate Erf function using Horner's Rule (without using factorial and power)

本文关键字:阶乘 Erf 规则 计算 函数      更新时间:2023-10-16

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

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); 
}

问题是第二部分需要我使用霍纳法则当a1,a2,a3....a(n)包含阶乘函数。那么我应该怎么做才能把阶乘函数变成别的东西,这样我就可以用递归函数来计算erf而不用阶乘。

霍纳法则

误差函数

可以简化为

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);
}