符號變量存入矩陣,便於計算高維函數梯度的求解
定義方式:
for i = 1:n
x(i) = syms(['x' num2str(i)]);
end
以n維Hager函數為例,
f=sum(exp(xi)-sqrt(i)*xi)
1 fx = 0; 2 for i = 1:n 3 fx = fx+exp(x(i))-sqrt(i)*x(i); 4 end
梯度函數:
for i = 1:n 'f_x'num2str(i) = diff(f,x(i)); end
此時的梯度函數為符號函數(個人理解即為函數表達式),可用matlabFunction(函數)轉化為函數
for i = 1:n 'fx' num2str(i) = matlabFunction('f_x' num2str(i)); end
繼而可以求解梯度函數值。
然而,到此遇到了一個問題,函數的偏導數維數往往不是n,想要求梯度函數在某個點處的值,若將改點坐標直接帶入梯度函數fxi(函數f關於xi的偏導函數),會提示參數不匹配,又該如何解決?問題可簡述如下,至今沒有好的思路,歡迎各路大神指導。
代碼如下:
clear all clc syms x1 x2 x3; f = x1^2+0.5*x2^2+0.5*x3^; X = [1;1;1]; f_x1 = diff(f,x1); f_x2 = diff(f,x2); f_x3 = diff(f,x3); fx1 = matlabFunction(f_x1); fx2 = matlabFunction(f_x2); fx3 = matlabFunction(f_x3); g1 = [fx1(X(1),X(2),X(3)),fx2(X(1),X(2),X(3)),fx3(X(1),X(2),X(3))];
結果提示最后一行參數不匹配。