exponenta event banner

differentiate

Дифференцируйте cfit или sfit объект

Синтаксис

fx = differentiate(FO, X)
[fx, fxx] = differentiate(...)
[fx, fy] = differentiate(FO, X, Y)
[fx, fy] = differentiate(FO, [x, y])
[fx, fy, fxx, fxy, fyy] = differentiate(FO, ...)

Описание

Для кривых

fx = differentiate(FO, X) дифференцирует cfit объект FO в точках, заданных векторным X и возвращает результат в fx.

[fx, fxx] = differentiate(...) также возвращает вторую производную в fxx.

Все возвращаемые аргументы одного размера и формируют как X.

Для поверхностей

[fx, fy] = differentiate(FO, X, Y) дифференцирует поверхностный FO в точках, заданных X и Y и возвращает результат в fx и fy.

FO поверхностная подгонка (sfit) объект сгенерирован fit функция.

X и Y должны быть массивы с двойной точностью и тот же размер и форма друг как друг.

Все возвращаемые аргументы одного размера и формируют как X и Y.

Если FO представляет поверхность z=f(x,y), затем FX содержит производные относительно x, то есть, dfdx, и FY содержит производные относительно y, то есть, dfdy.

[fx, fy] = differentiate(FO, [x, y]), где X и Y вектор-столбцы, позволяет вам задавать точки оценки как отдельный аргумент.

[fx, fy, fxx, fxy, fyy] = differentiate(FO, ...) вычисляет первые и вторые производные поверхностного подходящего объекта FO.

fxx содержит вторые производные относительно x, то есть, 2fx2.

fxy содержит смешанные вторые производные, то есть, 2fxy.

fyy содержит вторые производные относительно y, то есть, 2fy2.

Примеры

Для кривых

Создайте базовый синусоидальный сигнал:

xdata = (0:.1:2*pi)';
y0 = sin(xdata);

Добавьте зависимый ответом Гауссов шум в сигнал:

noise = 2*y0.*randn(size(y0)); 											
ydata = y0 + noise;

Соответствуйте зашумленным данным пользовательской синусоидальной моделью:

f = fittype('a*sin(b*x)');
fit1 = fit(xdata,ydata,f,'StartPoint',[1 1]);

Найдите производные сглаженной функции в предикторах:

[d1,d2] = differentiate(fit1,xdata);

Отобразите на графике данные, подгонку и производные:

subplot(3,1,1)
plot(fit1,xdata,ydata) % cfit plot method
subplot(3,1,2)
plot(xdata,d1,'m') % double plot method
grid on
legend('1st derivative')
subplot(3,1,3)
plot(xdata,d2,'c') % double plot method
grid on
legend('2nd derivative')

Можно также вычислить и построить производные непосредственно с cfit plot метод, можно следующим образом:

plot(fit1,xdata,ydata,{'fit','deriv1','deriv2'})

plot метод, однако, не возвращает данные по производным, в отличие от differentiate метод.

Для поверхностей

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

x = [0.64;0.95;0.21;0.71;0.24;0.12;0.61;0.45;0.46;...
0.66;0.77;0.35;0.66];
y = [0.42;0.84;0.83;0.26;0.61;0.58;0.54;0.87;0.26;...
0.32;0.12;0.94;0.65];
z = [0.49;0.051;0.27;0.59;0.35;0.41;0.3;0.084;0.6;...
0.58;0.37;0.19;0.19];
fo = fit( [x, y], z, 'poly32', 'normalize', 'on' );
[xx, yy] = meshgrid( 0:0.04:1, 0:0.05:1 );

[fx, fy] = differentiate( fo, xx, yy );

plot( fo, 'Style', 'Contour' );
hold on
h = quiver( xx, yy, fx, fy, 'r', 'LineWidth', 2 );
hold off
colormap( copper )

Если вы хотите использовать производные в оптимизации, можно, например, реализовать целевую функцию для fmincon можно следующим образом.

function [z, g, H] = objectiveWithHessian( xy )
        % The input xy represents a single evaluation point
        z = f( xy );
        if nargout > 1
            [fx, fy, fxx, fxy, fyy] = differentiate( f, xy );
            g = [fx, fy];
            H = [fxx, fxy; fxy, fyy];
        end
    end

Советы

Для моделей библиотеки с закрытыми формами тулбокс вычисляет производные аналитически. Для всех других моделей тулбокс вычисляет первую производную с помощью отношения приращений в центре

dfdx=f(x+Δx)f(xΔx)2Δx

где x является значением, в котором тулбокс вычисляет производную, Δx небольшое число (на порядке кубического корня eps), f(x+Δx) fun оцененный в x+Δx, и f(xxΔ) fun оцененный в xΔx.

Тулбокс вычисляет вторую производную с помощью выражения

d2fdx2=f(x+Δx)+f(xΔx)2f(x)(Δx)2

Тулбокс вычисляет смешанную производную для поверхностей с помощью выражения

2fxy(x,y)=f(x+Δx,y+Δy)f(xΔx,y+Δy)f(x+Δx,yΔy)+f(xΔx,yΔy)4ΔxΔy

Смотрите также

| |

Представлено до R2006a