Matlab 计算函数的导数

Matlab 计算函数的导数,matlab,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中完全理解它是怎么

假设有以下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++,注意代码的主要思想,请大家帮助我,我知道,数学是如何计算导数的,我需要理解代码< /p> < p>这个函数以多项式的系数作为输入。 给定一些多项式函数:

zx^n + yx^(n-1) + ... + cx^2 + bx + a
p = [z y ... c b a]
给定这些系数和相应的指数,我们有一个求多项式导数的算法(你知道的)。对于多项式中的每个项:

  • 将每个项的系数乘以该项的指数
  • 从指数中减去一
  • 所以…这就是你的代码所做的!我将(几乎)逐行介绍:

    function dp = derp(p)
        n = length(p) - 1;
    
    n是导数的长度(项数),它只比输入多项式小一个,因为常数项消失(对应的指数为零)。这也是输入多项式的阶数(最高指数值)

    这只是转换输入向量。我不知道为什么在你的代码中会这样做,这似乎是不必要的

        dp = p(1:n).*(n:-1:1);
    
    这里,每个系数
    p(1:n)
    乘以其项
    (n:-1:1)
    的指数

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

        if ~isempty(k)
            dp = dp(k(1):end);
        else
            dp = 0;
        end
    
    此if语句将
    dp
    设置为从第一个非零系数开始的导数的系数。如果所有计算的系数均为零(输入函数为常数),则dp仅设置为零


    希望这有帮助

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

    zx^n + yx^(n-1) + ... + cx^2 + bx + a
    p = [z y ... c b a]
    
    给定这些系数和相应的指数,我们有一个求多项式导数的算法(你知道的)。对于多项式中的每个项:

  • 将每个项的系数乘以该项的指数
  • 从指数中减去一
  • 所以…这就是你的代码所做的!我将(几乎)逐行介绍:

    function dp = derp(p)
        n = length(p) - 1;
    
    n是导数的长度(项数),它只比输入多项式小一个,因为常数项消失(对应的指数为零)。这也是输入多项式的阶数(最高指数值)

    这只是转换输入向量。我不知道为什么在你的代码中会这样做,这似乎是不必要的

        dp = p(1:n).*(n:-1:1);
    
    这里,每个系数
    p(1:n)
    乘以其项
    (n:-1:1)
    的指数

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

        if ~isempty(k)
            dp = dp(k(1):end);
        else
            dp = 0;
        end
    
    此if语句将
    dp
    设置为从第一个非零系数开始的导数的系数。如果所有计算的系数均为零(输入函数为常数),则dp仅设置为零


    希望这有帮助

    多项式表示为系数列表

    确保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);
    }
    

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

    多项式表示为系数列表

    确保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);
    }
    
    注意,以相反顺序存储系数可能更方便