Нахождение экстремума многомерной функции и ее приближение

Этот пример показывает, как найти экстремум многомерной функции и ее приближение около точки экстремума. Этот пример использует переменные символьной матрицы, чтобы представлять многомерную функцию и ее производные. Переменные символьной матрицы доступны, начиная с R2021a.

Рассмотрим многомерную функцию f(x)=sin(xTAx), где x является вектором 2 на 1 и A является матрицей 2 на 2. Чтобы найти локальное экстремальное значение этой функции, вычислите корень производной от f(x). Другими словами, найдите решение производной f(x0)=0.

Создайте функцию и найдите ее производную

Создайте вектор x и матрицу A как символьные матричные переменные. Определите функцию f(x)=sin(xTAx).

syms x [2 1] matrix
syms A [2 2] matrix
f = sin(x.'*A*x)
f = sin(xTAx)sin (транспонирование (symmatrix ('x', [2 1])) * symmatrix ('A', [2 2]) * symmatrix ('x', [2 1]))

Вычислите производную D функции f(x) относительно вектора x. Производная D отображается в компактной матрице обозначения в терминах x и A.

D = diff(f,x)
D = cos(xTAx)xTA+xTATcos (транспонирование (симматрица ('x', [2 1])) * симматрица ('A', [2 2]) * симматрица ('x', [2 1])) * (транспонирование (симматрица ('x', [2 1])) * симматрица ('A', [2 2]) + транспонирование

Преобразование symmatrix Объекты для sym Объекты

Переменные символьной матрицы x, A, f, и D являются symmatrix объекты. Эти объекты представляют матрицы, векторы и скаляры в компактном матричном обозначении. Чтобы показать компоненты этих переменных, преобразуйте symmatrix объекты к sym объекты, использующие symmatrix2sym.

xsym = symmatrix2sym(x)
xsym = 

(x1x2)[x1; x2]

Asym = symmatrix2sym(A)
Asym = 

(A1,1A1,2A2,1A2,2)[A1_1, A1_2; A2_1, A2_2]

fsym = symmatrix2sym(f)
fsym = (sin(x1A1,1x1+A1,2x2+x2A2,1x1+A2,2x2))[sin (x1 * (A1_1*x1 + A1_2*x2) + x2 * (A2_1*x1 + A2_2*x2))]
Dsym = symmatrix2sym(D)
Dsym = (cos(x1A1,1x1+A1,2x2+x2A2,1x1+A2,2x2)2A1,1x1+A1,2x2+A2,1x2cos(x1A1,1x1+A1,2x2+x2A2,1x1+A2,2x2)A1,2x1+A2,1x1+2A2,2x2)[cos (x1 * (A1_1*x1 + A1_2*x2) + x2 * (A2_1*x1 + A2_2*x2)) * (2 * A1 _ 1 * x1 + A1_2*x2 + A2_1*x2), cos (x1 * (A1_1*x1 + A1_2*x2) + x2 * (A2_1*x1 + A2_2*x2)) * (A1_2*x1 + A2_1*x1 + 2 * A2 _ 2 * x2)]

Подстановка числовых значений и нахождение минимума

Предположим, что вас интересует случай, когда значение A является [2 -1; 0 3]. Замените это значение функцией fsym.

fsym = subs(fsym,Asym,[2 -1; 0 3])
fsym = sin(3x22+x12x1-x2)Sin (3 * x2 ^ 2 + x1 * (2 * x1 - x2))

Замените значение A в производную Dsym

Dsym = subs(Dsym,Asym,[2 -1; 0 3])
Dsym = (cos(3x22+x12x1-x2)4x1-x2-cos(3x22+x12x1-x2)x1-6x2)[cos (3 * x2 ^ 2 + x1 * (2 * x1 - x2)) * (4 * x1 - x2), -cos (3 * x2 ^ 2 + x1 * (2 * x1 - x2)) * (x1 - 6 * x2)]

Затем примените символическую функцию solve чтобы получить корень производной.

[xmin,ymin] = solve(Dsym,xsym,'PrincipalValue',true);
x0 = [xmin; ymin]
x0 = 

(00)[sym (0); sym (0)]

Постройте график функции f(x) вместе с extremum решением x0. Установите интервал графика равным -1<x1<1 и -1<x2<1 как второй аргумент fsurf. Использование fplot3 для построения графика координат решения extremum.

fsurf(fsym,[-1 1 -1 1])
hold on
fplot3(xmin,ymin,subs(fsym,xsym,x0),'ro')
view([-68 13])

Figure contains an axes. The axes contains 2 objects of type functionsurface, parameterizedfunctionline.

Аппроксимация функции около минимума

Можно аппроксимировать многомерную функцию вокруг точки x0 с полиномиальным с использованием разложения Тейлора.

f(x)f(x0)+f(x0)(x-x0)+12(x-x0)TH(f(x0))(x-x0)

Здесь, термин f(x0) является градиентным вектором, и H(f(x0)) - матрица Гессия многомерной функции f(x) вычисляется в x0.

Найдите матрицу Гессия и верните результат как переменную символьной матрицы.

H = diff(f,x,x.')
H = -sin(xTAx)ATx+AxxTA+xTAT+cos(xTAx)AT+A- sin (транспонирование (симматрица ('x', [2 1])) * symmatrix ('A', [2 2]) * symmatrix ('x', [2 1])) * (транспонирование (симматрица ('A', [2 2])) * symmatrix ('x', [2 1]) + symimmatrix

Преобразуйте матрицу Гессия H(f(x0)) на sym тип данных, который представляет матрицу в ее компонентной форме. Использование subs чтобы вычислить матрицу Гессия для A = [2 -1; 0 3] в минимальной точке x0.

Hsym = symmatrix2sym(H);
Hsym = subs(Hsym,Asym,[2 -1; 0 3]);
H0 = subs(Hsym,xsym,x0)
H0 = 

(4-1-16)[sym (4), -sym (1); -sym (1), sym (6)]

Оцените градиент вектора f(x0) в x0.

D0 = subs(Dsym,xsym,x0)
D0 = (00)[sym (0), sym (0)]

Вычислите приближение Тейлора к функции, близкой к ее минимуму.

fapprox = subs(fsym,xsym,x0) + D0*(xsym-x0) + 1/2*(xsym-x0).'*H0*(xsym-x0)
fapprox = 

x12x1-x22-x2x12-3x2x1 * (2 * x1 - x2/2) - x2 * (x1/2 - 3 * x2)

Постройте график приближения функций на том же графике, который показывает f(x) и x0.

hold on
fsurf(fapprox,[-1 1 -1 1])
zlim([-1 3])

Figure contains an axes. The axes contains 3 objects of type functionsurface, parameterizedfunctionline.