定义符号变量矩阵,求解梯度函数及其函数值

符号变量存入矩阵,便于计算高维函数梯度的求解

定义方式:

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))];

  结果提示最后一行参数不匹配。

猜你喜欢

转载自www.cnblogs.com/ibiancheng/p/9897092.html