符号变量存入矩阵,便于计算高维函数梯度的求解
定义方式:
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))];
结果提示最后一行参数不匹配。