Существуют разные подходы для вычисления производной в тех же точках, что и исходные данные:
- Конечные разности. Используйте схему центральной разности во внутренних точках и схему прямого/обратного хода в первой/последней точке.
or
- Аппроксимация кривой. Сопоставьте кривую с вашими точками, вычислите производную этой подобранной функции и выберите их в тех же точках, что и исходные данные. Типичными подгоночными функциями являются полиномы или сплайн-функции.
Обратите внимание, что метод подгонки кривой дает лучшие результаты, но требует больше параметров настройки и работает медленнее (примерно в 100 раз).
Демонстрация
В качестве примера я вычислю производную синусоидальной функции:
t = 0:0.1:1;
y = sin(t);
Его точная производная хорошо известна:
dy_dt_exact = cos(t);
Производную можно приблизительно рассчитать как:
Конечные отличия:
dy_dt_approx = zeros(size(y));
dy_dt_approx(1) = (y(2) - y(1))/(t(2) - t(1)); % forward difference
dy_dt_approx(end) = (y(end) - y(end-1))/(t(end) - t(end-1)); % backward difference
dy_dt_approx(2:end-1) = (y(3:end) - y(1:end-2))./(t(3:end) - t(1:end-2)); % central difference
or
Полиномиальная подгонка:
p = polyfit(t,y,5); % fit fifth order polynomial
dp = polyder(p); % calculate derivative of polynomial
Результаты можно визуализировать следующим образом:
figure('Name', 'Derivative')
hold on
plot(t, dy_dt_exact, 'DisplayName', 'eyact');
plot(t, dy_dt_approx, 'DisplayName', 'finite difference');
plot(t, polyval(dp, t), 'DisplayName', 'polynomial');
legend show
figure('Name', 'Error')
hold on
plot(t, abs(dy_dt_approx - dy_dt_exact)/max(dy_dt_exact), 'DisplayName', 'finite difference');
plot(t, abs(polyval(dp, t) - dy_dt_exact)/max(dy_dt_exact), 'DisplayName', 'polynomial');
legend show
![введите здесь описание изображения](https://i .stack.imgur.com/Y1x6Qm.png)
На первом графике показаны сами производные, а на втором — относительные ошибки, допущенные обоими методами.
Обсуждение
Хорошо видно, что метод подбора кривой дает лучшие результаты, чем метод конечных разностей, но он в ~100 раз медленнее. Методы подбора кривой имеют относительную погрешность порядка 10^-5
. Обратите внимание, что метод конечных разностей становится лучше, когда ваши данные выбираются более плотно или вы используете схему более высокого порядка. Недостатком подхода подбора кривой является то, что необходимо выбрать хороший полиномиальный порядок. В общем случае сплайн-функции могут лучше подходить.
В 10 раз более быстрый выборочный набор данных, т. е. t = 0:0.01:1;
, приводит к следующим графикам:
![введите здесь описание изображения](https://i .stack.imgur.com/lEUs3m.png)
person
m7913d
schedule
06.07.2017
diff(x) ./ diff(t)
- person ammportal   schedule 06.07.2017diff(x) ./ diff(t)
. Конечно, метод, который вы описали, лучше подходит. - person ammportal   schedule 07.07.2017