вычислить производную функции - PullRequest
0 голосов
/ 21 февраля 2012

предположим, что дан следующий код 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 ++ и обратим внимание наОсновные идеи кода, пожалуйста, ребята, помогите мне, я знаю, математика, как вычисляется производная, мне нужно понимание в коде

Ответы [ 2 ]

2 голосов
/ 21 февраля 2012

Полином представлен в виде списка коэффициентов.

убедитесь, что 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);
}

Если вызывающий отвечает за выделение массива размером polysize-1 для dervpoly.

Полином:

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

Обратите внимание, что может быть удобнее хранить коэффициенты в обратном порядке.

2 голосов
/ 21 февраля 2012

Эта функция принимает коэффициенты полинома в качестве входных данных p.Дана некоторая полиномиальная функция:

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

Даны эти коэффициенты и соответствующие показатели [0 1 2 3 ...], у нас есть алгоритм для получения производной от полинома (который вы знаете).Для каждого члена многочлена:

  1. Умножьте коэффициент каждого члена на показатель этого термина
  2. Вычтите одно из показателя

Так... это то, что делает ваш код!Я пройдусь по нему (почти) построчно:

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

n - это длина (количество членов) производной, она будет на единицу меньше входного полинома, потому что постоянный членвыпадает (соответствующий показатель равен нулю).Это также порядок входного полинома (наибольшее значение показателя степени).

    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 просто устанавливается на ноль.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...