Как получить производную функции в MATLAB? - PullRequest
5 голосов
/ 20 марта 2012

В реальной жизни это очень просто, но как получить производную от квадратичной или кубической функции в matlab?

Например, A*x^3 + B*x^2 + C*x + D будет 3*Ax^2 + 2*b*x + C

Iхочу получить это в Matlab, но я не могу понять, как: (

например, я пробовал этот код, но я получаю глупый результат (возможно, я тот, кто должен быть обвинен!):

>> x = [6 3 2 1]

x =

     6     3     2     1

>> xPrime = diff(x)

xPrime =

    -3    -1    -1

Обычно он должен давать [18 6 2] ?? Также я хочу знать, как это сделать для диапазона чисел. Например, я хочу получить производную каждой точки для примера выше для n = linspace(0,10,1000)

обновление конечно, я могу сделать это вручную, но мне действительно нравится знать, как это сделать с самим matlab.

То, что я делаю сейчас, это получение касательной линииПример выше, и я делаю так, и это работает:

x = linspace(0,10,1000);
y=A*x.^3+B*x.^2+C*x + D;
plot(x,y);
hold on;
slop=3*A.*(Location^2)+2*B.*Location+C;
b=(A.*Location.^3)+(B.*Location.^2)+(C.*Location)+D;
y2=slop*(x-Location)+b;
plot(x,y2,'--r');
legend('Graph of the function','Tangent Line');
hold off;

Я имею в виду то, что я должен использовать вместо вычисленной вручную производной в этой строке:

slop=3*A.*(Location^2)+2*B.*Location+C;

Спасибо!

Ответы [ 4 ]

3 голосов
/ 20 марта 2012

Чтобы получить производную от полинома, который сам является полиномом, используйте функцию Matlab polyder().Это принимает стандартное представление коэффициентов полинома в качестве вектора и возвращает его производную в качестве второго вектора коэффициента.Вы можете оценить производную полинома p при некотором значении x, например:

slop = polyval(polyder(p), x);
3 голосов
/ 20 марта 2012

Вы хотите проверить символическую библиотеку Matlab (на основе движка Maple). Основная идея заключается в том, что вы захотите создать символические переменные («syms»), а затем символически дифференцировать эти выражения. Затем вы можете выполнить преобразование между вашим символическим выражением и дескриптором функции, который будет оценивать ваше символическое выражение по некоторым значениям координат. См. здесь для получения инструкций по синтаксису, библиотеке 'syms' и т. Д.

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

Если все, с чем вы когда-либо будете работать, это полиномы, то это достаточно особый случай, когда вы сможете написать общую функцию Matlab, которая принимает список коэффициентов и диапазон значений в качестве входных данных и выводит список производных коэффициентов плюс производная функция, оцениваемая по этим значениям. Вот пример:

 function [d_coeffs, d_vals] = compute_poly_derivative(in_coeffs, in_values)
 num_terms = length(in_coeffs)-1;
 max_power = num_terms;

 for ii=1:num_terms
     d_coeffs[ii] = in_coeffs[ii]*max_power;
     max_power = max_power - 1;
 end

 d_vals = polyval(d_coeffs,in_values);
2 голосов
/ 20 марта 2012

Вы можете сделать это численно, используя конечные различия .MATLAB имеет функцию gradient, которая включает в себя схему 2-го порядка точности - см. здесь .

Если вы искали более высокую точность, вы могли бы реализовать собственную схему более высокого порядка.

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

1 голос
/ 20 марта 2012

diff дает разницу между последовательными элементами в списке: 3 - 6 - это -3, 2 - 3 - это -1 и т. Д.

Вы можете использовать символьную панель инструментов если есть.Или, если вам нужны только полиномы, это не так сложно написать самостоятельно:

ds = poly .* fliplr(0:length(poly)-1);
ds = [0 ds(1:end-1)];

Это просто умножает каждый коэффициент на его показатель степени (fliplr переворачивает список), а затем сдвигает показатели на единицу(перемещение элементов списка на один вправо).

Это дает вам новое представление многочлена.Чтобы оценить один из них в данной точке x, попробуйте

sum(poly .* x .^ fliplr(0:length(poly)-1))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...