计算函数的导数

时间:2012-02-20 21:51:33

标签: matlab

假设有以下matlab代码

function dp = derp(p)
n = length(p) - 1;
p = p(:)';
dp = p(1:n).*(n:-1:1);
k = find(dp ~= 0);
if ~isempty(k)
dp = dp(k(1):end);
else
dp = 0;
end

正如我从书中所知,我从这里得到了这段代码,它只是计算出函数的导数,多项式的导数,但是如果我想用c ++编写它,如何重写它?请解释一下这段代码的想法,我只需要在matlab中完全理解它做了什么,暂时让我们忘记c ++并注意代码的主要思想,请大家帮助我,我知道,算法,mathematicaly如何派生计算,我需要在代码中理解

2 个答案:

答案 0 :(得分:2)

此函数将多项式的系数作为其输入p。 给定一些多项式函数:

zx^n + yx^(n-1) + ... + cx^2 + bx + a
p = [z y ... c b a]

给定这些系数和相应的指数[0 1 2 3 ...],我们有一个算法来获取多项式的导数(你知道)。对于多项式中的每个项:

  1. 将每个项的系数乘以该项的指数
  2. 从指数中减去一个
  3. 所以...这就是你的代码所做的!我会(几乎)逐行完成它:

    function dp = derp(p)
        n = length(p) - 1;
    

    n是导数的长度(项数),它只比输入多项式小1,因为常数项消失(相应的指数为零)。这也是输入多项式的 order (最高指数值)。

        p = p(:)';
    

    这只是转置输入向量。我...不确定为什么在你的代码中完成,似乎没必要。

        dp = p(1:n).*(n:-1:1);
    

    此处每个系数p(1:n)乘以其术语(n:-1:1)的指数。

        k = find(dp ~= 0);
    

    这将搜索系数不为零的任何索引,并将这些索引存储在k中。

        if ~isempty(k)
            dp = dp(k(1):end);
        else
            dp = 0;
        end
    

    此if语句将dp设置为从第一个非零系数开始的导数系数。如果所有计算的系数都为零(输入函数是常数),则dp仅设置为零。

    希望这有帮助!

答案 1 :(得分:2)

多项式表示为系数列表。

确保p是行向量。

p = p(:)';

将每个元素乘以它的索引

dp = p(1:n).*(n:-1:1);

从列表前面删除任何零项

k = find(dp ~= 0);
if ~isempty(k)
   dp = dp(k(1):end);
else
   dp = 0;
end

在C中,你可能会这样写:

void derivative(const double *poly, int polysize, double *dervpoly)
{
    for (int i=0 ; i<polysize-1 ; i++)
        dervpoly[i] = poly[i]*(polysize-i-1);
}

调用者负责为dervpoly分配大小为polysize-1的数组。

多项式是:

poly[0]*x^(polysize-1) + poly[1]*x^(polysize-2) + .. + poly[polysize-2]*x + poly[polysize-1]

请注意,以相反的顺序存储系数可能更方便。