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

В этом примере показано, как найти экстремум многомерной функции и ее приближения около точки экстремума. Этот пример использует переменные символьной матрицы, чтобы представлять многомерную функцию и ее производные. Переменные символьной матрицы являются доступным запуском в 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 ([2 2]) *symmatrix ('x', [2 1]))

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

D = diff(f,x)
D = cos(xTAx)xTA+xTATbecause(транспонируют (symmatrix ('x', [2 1])) *symmatrix ([2 2]) *symmatrix ('x', [2 1])) * (транспонируйте (symmatrix ('x', [2 1])) *symmatrix ([2 2]) + транспонируют (symmatrix ('x', [2 1])) *transpose (symmatrix ([2 2])))

Преобразуйте symmatrix Объекты к sym Объекты

Переменные x символьной матрицыAF, и 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), because(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) вместе с решением для экстремума x0. Установите интервал графика на -1<x1<1 и -1<x2<1 в качестве второго аргумента fsurf. Используйте fplot3 построить координаты решения для экстремума.

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 (транспонируют (symmatrix ('x', [2 1])) *symmatrix ([2 2]) *symmatrix ('x', [2 1])) * (транспонируют (symmatrix ([2 2])) *symmatrix ('x', [2 1]) + symmatrix ([2 2]) *symmatrix ('x', [2 1])) * (транспонируйте (symmatrix ('x', [2 1])) *symmatrix ([2 2]) + транспонируют (symmatrix ('x', [2 1])) *transpose (symmatrix ([2 2]))) + because(транспонируют (symmatrix ('x', [2 1])) *symmatrix ([2 2]) *symmatrix ('x', [2 1])) * (транспонируйте (symmatrix ([2 2])) + symmatrix ([2 2]))

Преобразуйте матрицу Гессиана 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.

Для просмотра документации необходимо авторизоваться на сайте