您的位置:首页 > 编程语言 > C语言/C++

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

2017-03-12 22:10 260 查看
最近在读 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
;
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
;
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
;
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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: