-3

我正在尝试编写一个函数来计算多项式函数的导数。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;
}
4

1 回答 1

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 的方法的循环来计算它。

对于您的程序,您正在几个循环中处理它,这是不必要的。但是,您的第一个循环正在尝试重新计算系数。第一个系数是一个常数,因此在应用导数时应该重新计算为零。相反,你乘以(i+1)。只是乘以i代替。

在您的第二个循环中,您知道度数已减小,但由于第一项为 0,您不必减小degr变量。您应该从 index 开始循环1。在 for 循环本身的主体内,pow计算应该提高到i-1能力。

在您的sum计算循环中,也从 index 开始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;
}
于 2012-07-11T20:51:05.833 回答