matlab - 如何在 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
解决方案
添加'Display','Iter'
到您的optimoptions
调用中,以便您可以查看优化器正在执行的更多详细信息。优化器可能已进入条件不佳的区域,或者接近局部最小值或鞍点,导致成本函数梯度的有限差分近似表现不佳。
一个建议是尝试在调用中设置FiniteDifferenceStepSize
一些小的值。optimoptions
这是一个例子:
optimoptions(@fminunc, 'MaxIterations', 10000, 'MaxFunctionEvaluations', 50000, 'Display', 'Iter', 'FiniteDifferenceStepSize', 1e-3);
推荐阅读
- javascript - 如何使用 Javascript 将多个音频文件附加到当前正在播放的音频中?
- android - 是否有任何方法可以清除我所有低于 21 的 android 应用程序任务(活动返回堆栈)?
- node.js - 有问题。邮政。评论模式 - Mongoose/Typescript
- mongodb - MongoDB - 如何在插入时引用父级中的子级/嵌套文档_id
- haskell - 如何确定一个 Enum 值是否是另一个 Enum 值的后继值?
- docker - 下载 Hyperledger Fabric docker 图像时遇到问题
- reactjs - 使用 Enzyme 更改 React 功能组件的 Props
- javascript - 如何将两个字段组合成第三个标签?
- azure - 在 Azure App Service for Containers 上启用 gzip 压缩
- xamarin - Xam.Plugin.Media 获取路径