虽然我的第一部分使我能够使用阶乘和幂,所以我创建了一些函数原型并使用递归函数来获得错误函数如下:
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而不使用阶乘。
答案 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);
}