exponenta event banner

Найти экстремум многомерной функции и ее аппроксимацию

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

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

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

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

syms x [2 1] matrix
syms A [2 2] matrix
f = sin(x.'*A*x)
f = sin(xTAx)sin(transpose(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(transpose(symmatrix('x', [2 1]))*symmatrix('A', [2 2])*symmatrix('x', [2 1]))*(transpose(symmatrix('x', [2 1]))*symmatrix('A', [2 2]) + transpose(symmatrix('x', [2 1]))*transpose(symmatrix('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) вместе с решением экстремума 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(transpose(symmatrix('x', [2 1]))*symmatrix('A', [2 2])*symmatrix('x', [2 1]))*(transpose(symmatrix('A', [2 2]))*symmatrix('x', [2 1]) + symmatrix('A', [2 2])*symmatrix('x', [2 1]))*(transpose(symmatrix('x', [2 1]))*symmatrix('A', [2 2]) + transpose(symmatrix('x', [2 1]))*transpose(symmatrix('A', [2 2]))) + cos(transpose(symmatrix('x', [2 1]))*symmatrix('A', [2 2])*symmatrix('x', [2 1]))*(transpose(symmatrix('A', [2 2])) + symmatrix('A', [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.