在Matlab中从复杂的目标函数中找到梯度

时间:2018-05-14 02:51:36

标签: matlab gradient

我在从以下目标函数计算符号渐变时遇到问题:

syms x
gradient(@objfun,x)


function f = objfun(x)

N = 4;
I = 3;
fr = 5;

f_temp = 0;
for n=1:N
    sum2 = 0;
    for i=1:I
        sum1 = fr*(1 - x(n+((i-1)*N)));
        sum2 = sum2 + sum1;  
    end
    f_temp = f_temp + sum2;
end

f = 100*f_temp;                
end

然而,出现此错误"只有没有参数的匿名函数和函数才能转换为sym"。如何使这段代码有效?

1 个答案:

答案 0 :(得分:2)

gradient函数将符号表达式作为输入,而不是函数指针。 MATLAB的抱怨是因为它试图将你的函数指针转换为符号表达式,而且它不能。

在这种情况下,以下工作

N = 4; I = 3;
x = sym('x',[N,I]);     % Define a matrix of symbolic variables
f = objfun(x);          % Get symbolic expression for objfun in terms of x

免责声明这是有效的,因为符号变量支持objfun中的所有操作。对于更复杂的目标函数,这种方法可能无效。

这将x定义为N - { - 1}}符号变量矩阵

I

并将>> x x = [ x1_1, x1_2, x1_3] [ x2_1, x2_2, x2_3] [ x3_1, x3_2, x3_3] [ x4_1, x4_2, x4_3] 定义为

f

然后我们发现>> f f = 6000 - 500*x1_2 - 500*x1_3 - 500*x2_1 - 500*x2_2 - 500*x2_3 - 500*x3_1 - 500*x3_2 - 500*x3_3 - 500*x4_1 - 500*x4_2 - 500*x4_3 - 500*x1_1 的渐变f

x

额外>> g = reshape(gradient(f,x(:)), size(x)) g = [ -500, -500, -500] [ -500, -500, -500] [ -500, -500, -500] [ -500, -500, -500] 符合渐变的通用解释,作为与reshape尺寸相同的张量。

修改 回应评论。如果你想在x中使用它,那么你有一个既给出目标值又有渐变的函数,那么你可以构造如下的函数句柄。

fmincon

现在你可以随时获得目标和渐变。例如,在x = 1(N,I);

grad_fun = matlabFunction(g,'Vars',x);
obj_with_grad = @(x) deal(objfun(x), grad_fun(x));

我没有测试过,但您现在可以通过将>> [obj_val, grad_val] = obj_with_grad(ones(N,I)) obj_val = 0 grad_val = -500 -500 -500 -500 -500 -500 -500 -500 -500 -500 -500 -500 的{​​{1}}选项设置为{obj_with_gradfmincon使用fmincon {1}}。