我有以下内容:
我只想(现在)表达(s 1),(s 2)术语。 例如,(s 1)= s,(s 2)= s(s-1)/ 2! ,(s 3)= s(s-1)(s-2)/ 3!
我创建了一个阶乘函数:
//compute factorial
int fact(int x){
if (x==0)
return 1;
else
return fact(x-1)*x;
}
我在如何做到上述方面遇到了问题。
.....
double s=(z-x[1])/h;
double s_term=0;
for (int p=1;p<=n;p++){
if p==1
s_term=s;
else
s_term=s*(s-p)/fact(p+1);
}
此外,它是:s =(x - x0)/ h。 我不知道我是否在上面宣布了正确的。(我在声明中使用x 1,因为这是我的起点)
谢谢!
答案 0 :(得分:2)
您可以使用此函数计算二项式系数(可能是性能和内存使用效果最佳):
unsigned long long ComputeBinomialCoefficient( int n, int k )
{
// Run-time assert to ensure correct behavior
assert( n > k && n > 1 );
// Exploit the symmetry in the line x = k/2:
if( k > n - k )
k = n - k;
unsigned long long c(1);
// Perform the product over the space i = [1...k]
for( int i = 1; i < k+1; i++ )
{
c *= n - (k - i);
c /= i;
}
return c;
}
您可以在看到括号时调用此方法。 (我假设那是二项式系数,而不是2D列向量?)。此技术仅在内部使用2个变量(占用总共12个字节),并且不使用递归。
希望这有帮助! :)
编辑:我很好奇你将如何做(我假设laplacian)操作员?你打算对x的离散值做前向差分法,然后用第一个得到的结果计算二阶导数,然后取商数吗?答案 1 :(得分:0)
使用循环而不是递归,使用阶乘部分会更有效率。
对于二项式系数,行:
s_term=s*(s-p)/fact(p+1);
不会产生预期的效果,因为你只是正确设置了第一个和最后一个术语而错过了(s-1),(s-2),...,(s-p + 1)条款。它更容易使用:
s_term = fact(s) / (fact(p) * fact(s-p))
为s选择p。
答案 2 :(得分:0)
正如其他人所指出的那样,实现阶乘和二项式系数函数并不容易(例如,到处都是潜伏的溢出)。
如果你对合理的实现感兴趣而不是实现所有这些,那么你可以看一下gsl中可用的,每个处理数值问题的人都应该知道。
#include <gsl/gsl_sf_gamma.h>
double factorial_10 = gsl_sf_fact(10);
double ten_over_four = gsl_sf_choose(10, 4);
还要查看文档。有许多函数返回日志而不是值to avoid overflow problems。