c - 如何计算多项式导数?

标签 c function derivative

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

相关文章:

python - 在 python 的类中使用函数(使用或不使用 self)

c - 具有 sqrt 、abs 和 c 上的导数的方程

java - 我怎样才能在反向传播中获取softmax输出的导数

无法链接小型 C 和 Fortran 程序

c - 强大的 typedef 静态检查器 (unix)

algorithm - 实现求根功能

r - 在 R 中获取导数

c - semctl GETVAL 无法读取信号量值

c - Linux内核模块开发buildroot

mysql - MariaDB 用户定义的函数在需要小数时返回 int 或 null