我正在尝试编写一个函数来计算多项式函数的导数。 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;
}
答案 0 :(得分:1)
让我们做一些假设。如果多项式看起来像这样:
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;
}