首页 > 解决方案 > 如何在 MATLAB 中使用“fminunc”解决最小化问题中的线搜索错误?

问题描述

我想找到使作为 B 矩阵函数的 beta_d (1 4 向量)的元素等于“给定” beta_u (1 4 向量)的相应元素的 B (2 2 矩阵),即 beta_d( 1,1) = beta_u(1,1) && beta_d(1,2) = beta_u(1,2) && beta_d(1,3) = beta_u(1,3) && beta_d(1,4) = beta_u(1 ,4)。因此,我开始使用“fminunc”来查找 B(2 2 矩阵)的值,该值使两个向量中相应元素之间的差异最小化。但是,它通常会给我以下错误:

Error using lineSearch
Search direction is not a descent direction; roundoff errors may be affecting convergence.
Error in fminusub (line 186)
          lineSearch(funfcn,x,dir,f,dirDerivative, ...
Error in fminunc (line 472)
   [x,FVAL,GRAD,HESSIAN,EXITFLAG,OUTPUT] = fminusub(funfcn,x, ...

谁能帮我解决这个“fminuc”问题?或建议另一种方法来找到 B (2 * 2 矩阵)的值,以最小化两个向量 beta_u 和 beta_d 中相应元素之间的差异?我的代码是:

clc;
clear;
% System paramters:
c_l = 4;
counter = 0;
H = [0.7182   -1.9924; 0.8306    0.0195; -0.6868   -0.7119; -0.1692    0.1084];
A = [-3 1; 1 0];
C = [1  -2; 0  1; 1 -2; 0 1]; 
P_u = 25*eye(4);
P_d = 25*eye(2);
beta_u = [50.4551   59.1605   50.4551   59.1605];
beta_d = zeros(1,4); % intial value
%store inputs to a struct for shorter syntax
s=struct;
[s.H,s.A,s.C,s.P_u,s.P_d,s.C_l]=deal(H,A,C,P_u,P_d,c_l);
while (sum(abs(beta_u-beta_d))>0.1 && counter< 500)
    initial_guess = randn(2,2);
    OLS = @(B_d,input_vars)sum(abs(beta_u-myfun(B_d,input_vars)).^2);%ordinary least squares cost function
    opts = optimoptions(@fminunc,'MaxIterations',10000,'MaxFunctionEvaluations',50000);
    [B,FVAL,grad] = fminunc(OLS, initial_guess, opts,s);
    input_vars = s;
    [beta_d,D_d]= myfun(B,input_vars);
    counter = counter+1;
end
%calculate beta_d from B and the other inputs
function [beta_d,D_d]=myfun(B,input_vars)
%load parameters
s=input_vars;[H,A,C,P_u,P_d,C_l]=deal(s.H,s.A,s.C,s.P_u,s.P_d,s.C_l);
for j=1:1:2
    d(j) = (B(j,:)*P_d*B(j,:)')/((2^(2*C_l))-(norm(A(:,j))^2));
end
D_d = diag(d);
for i=1:1:4   
    V_d(i)=C(i,:)*P_d*B'*H(i,:)'*inv(1+H(i,:)*(A'*D_d*A+B*P_d*B')*H(i,:)');
    sigma_d(i)=norm((V_d(i)*H(i,:)*B-C(i,:))*(P_d^(1/2)))^2+(V_d(i)^2)*(1+H(i,:)*A'*D_d*A*H(i,:)');
    beta_d(i)=((P_u(i,i))/sigma_d(:,i));   
end
end

标签: matlabmatrixvectornonlinear-optimization

解决方案


添加'Display','Iter'到您的optimoptions调用中,以便您可以查看优化器正在执行的更多详细信息。优化器可能已进入条件不佳的区域,或者接近局部最小值或鞍点,导致成本函数梯度的有限差分近似表现不佳。

一个建议是尝试在调用中设置FiniteDifferenceStepSize一些小的值。optimoptions

这是一个例子:

optimoptions(@fminunc, 'MaxIterations', 10000, 'MaxFunctionEvaluations', 50000, 'Display', 'Iter', 'FiniteDifferenceStepSize', 1e-3);

推荐阅读