我正在尝试编写一个函数来计算多项式函数的导数。 degr
是多项式的次数,arr
是包含多项式系数的数组。我想计算点t
处的导数.
下面是我的尝试,但它总是返回 0
。我不明白出了什么问题。
float derv(int degr,int arr[],float t)
{
int i,n;
float sum=0;
float arr2[degr+1];
for (i=0;i<degr+1;i++) {
arr[i]=(arr[i]*(i+1));
}
degr=degr-1;
for (i=0;i<degr+1;i++)
{
arr2[i] = (pow(t,degr-i)*arr[i]);
}
for(n=0;n<degr+1;n++)
{
sum = sum + arr2[n];
}
return sum;
}
最佳答案
让我们做一些假设。如果多项式如下所示:
degr
.---
p(x) = > arr[i] * pow(x, i)
`---
i=0
然后,导数将通过以下方式获得:
degr
d .---
-- p(x) = > i * arr[i] * pow(x, i-1)
dx `---
i=1
您应该能够使用类似于 Horner's method 的循环来计算它.
对于您的程序,您正在多个循环中处理它,这是不必要的。但是,您的第一个循环正在尝试重新计算系数。第一个系数是常数,因此在应用导数时应将其重新计算为零。相反,您将乘以 (i+1)
。只需乘以 i
即可。
在第二个循环中,您知道度数已减少,但由于第一项为 0,因此您不必递减 degr
变量。您应该从索引 1
开始循环。在 for 循环本身的主体内,pow
计算应提高到 i-1
次方。
在您的 sum
计算循环中,也从索引 1
开始。
您应该能够看到我向您建议的更改是如何直接从我上面提供的公式中得出的。
请注意,由于您修改了表示多项式的数组,因此您无法再次调用该函数来计算不同值的导数。您可以通过修改第一个循环来解决此问题,以便将系数存储在 arr2
中,然后更改第二个循环以便从 arr2
获取系数。现在,您可以在 derv
函数中将输入数组声明为常量。
包含我建议的更改的代码如下所示:
float derv(int degr,const int arr[],float t)
{
int i,n;
float sum=0;
float arr2[degr+1];
for (i=0;i<degr+1;i++) {
arr2[i]=(arr[i]*i);
}
for (i=1;i<degr+1;i++)
{
arr2[i] = (pow(t,i-1)*arr2[i]);
}
for(n=1;n<degr+1;n++)
{
sum = sum + arr2[n];
}
return sum;
}
关于c - 如何计算多项式导数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11440868/