Первая производная в Matlab
Я хочу вычислить первую производную функции с помощью Matlab. Однако я не знаю формулу функции, у меня есть доступ только к ее входам и выходам. Например:
f([1 2 3 4 5]) = [1 4 9 16 25]; %Square function for the example
Я не удовлетворен результатом:
diff([1 2 3 4 5]) %Which is [3 5 7 9]
Я видел на этом форуме, что я не единственный, кто пытается вычислить первую производную функции с помощью matlab. Но так как я не знаю математическую формулу своей функции, я не могу использовать символический Math Toolbox.
Итак, мои вопросы:
- Как я могу вычислить производную функции в Matlab, зная только ее входы и выходы?
- Могу ли я найти способ получить математическую формулу моей функции, чтобы я мог использовать символический набор инструментов Math?
Спасибо за помощь.
2 ответа
Предполагая, что вы можете легко оценить функцию, вот простой способ оценить производную. (Предполагая, что функция ведет себя хорошо)
x = 1:5
h = 0.0001;
dir_est= (f(x)-f(x+h))/h
Обратите внимание, что это очень похоже на определение производного.
Чтобы решить вашу проблему, как описано, я бы использовал комбинацию polyfit
а также polyval
с подходом грубой силы. Что-то вроде этого.
in = [1 2 3 4 5];
out = fun(in); % in this case, simply y = x.^2
epsilon = 0.000001;
test = inf;
best = 0;
% some large term count
test = inf;
best = 0;
for n = 0:7
p = polyfit(in, out, n);
val = sqrt(sumsqr(polyval(p, in) - out));
if ((val < test) & (abs(val - test) > epsilon))
best = n;
test = val;
end
end
p = polyfit(in, out, best);
syms x, f;
expo = best:-1:0;
f = p * (x.^expo).';
Тогда вы можете использовать символическую математику в переменной f
, В приведенном вами примере это возвращает многочлен с преобладанием x^2
,
Тем не менее, кажется, что лучшим подходом было бы использование либо определения производной, либо более надежных численных методов, чем простая разница, как предлагали другие.