多项式求值的几个简单算法(C语言)

最近在读 Numerical Recipes in C++ ,上面给了些多项式求值的算法,很实用。放在这里备用。三个函数,分别是多项式求值,多项式求导数值,多项式求各阶导数值。

下面的代码全都简单验算过,应该没什么问题,可以大胆的使用。


/**
 * @brief poly 计算多项式的值,采用 horner 算法
 * @param coff 多项式的系数,c0, c1, ... cN
 * @param n 多项式最高项的次数
 * @param x 自变量的取值
 * @return 多项式在 x 处的值
 */
double poly(const double coff[], int N, double x)
{
    double p = coff[N];
    for(int j = N - 1; j >= 0; j--)
    {
        p = p * x + coff[j];
    }
    return p;
}

/**
 * @brief dpoly 计算多项式的值和一阶导数值
 * @param coff  多项式的系数,c0, c1, ... cN
 * @param N 多项式最高项的次数
 * @param x 自变量的取值
 * @param [out] d 多项式在 x 处的导数值
 * @return 多项式在 x 处的值
 */
double dpoly(const double coff[], int N, double x, double &dp)
{
    dp = 0;
    double p = coff[N];
    for(int j = N - 1; j >= 0; j--)
    {
        dp = dp * x + p;
        p = p * x + coff[j];
    }
    return p;
}

/**
 * @brief ddpoly 计算多项式的第 0 阶到第 M 阶导数
 * @param coff 多项式的系数,c0, c1, ... cN
 * @param N 多项式最高项的次数
 * @param x 自变量的取值
 * @param dp 多项式在 x 处的各阶导数值,从 0 阶到 M 阶
 * @param M 需要求解的多项式的导数的最高阶次
 */
void ddpoly(double coff[], int N, double x, double dp[], int M)
{
    dp[0] = coff[N];
    for(int j = 1; j < M; j++)
    {
        dp[j] = 0.0;
    }
    int nnd = 0;
    for(int i = N - 1; i >= 0; i--)
    {
        nnd = (M < N - i) ? M : N - i;
        for(int j = nnd; j > 0; j--)
        {
            dp[j] = dp[j] * x + dp[j - 1];
        }
        dp[0] = dp[0] * x + coff[i];
    }
    double cnst = 1.0;
    for(int i = 2; i < M + 1; i ++)
    {
        cnst = cnst * i;
        dp[i] = dp[i] * cnst;
    }
}

你可能感兴趣的:(数值计算)