c ++如何表达数学术语

时间:2011-07-29 16:18:57

标签: c++

我有以下内容: enter image description here

我只想(现在)表达(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,因为这是我的起点)

谢谢!

3 个答案:

答案 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