本文记录一些黎曼流型的优化工具箱的使用
入手
安装
https://www.manopt.org/tutorial.html#gettingstarted
check的时候跑basicexample.m跑出的结果
尝试写代码解决优化问题:
原先一直报错的代码
% 设置问题参数
N_t = 10; % N_t 的值,根据你的问题设置
w_hat_J = randn(N_t, 1) + 1i * randn(N_t, 1); % 随机生成 w_hat_J
f_BJ = randn(N_t, 1) + 1i * randn(N_t, 1); % 随机生成 f_BJ
% 初始化 Riemannian manifold 结构
% manifold = grassmanncomplexfactory(1 , N_t * N_t); % 在 Grassmann 流形上执行优化
% manifold = obliquecomplexfactory(N_t * N_t, 1, true);
% complexcirclefactory( N_t * N_t)
manifold = complexcirclefactory( N_t * N_t)
% 定义问题描述
problem.M = manifold;
A = kron(f_BJ.', eye(N_t));
% 定义目标函数3.
problem.cost = @(vecF_RJ) norm(w_hat_J - A * vecF_RJ)^2; % N_t * N_t^2 \times N_t^2 * 1
problem.egrad = @(vecF_RJ) -2*A'*(w_hat_J - A*vecF_RJ);
problem.ehess = @(vecF_RJ, u) 2 * (A' * A) * vecF_RJ - 2 * A' * w_hat_J + 2 * A' * (A * vecF_RJ);
% 设置优化器选项
options.maxiter = 100; % 最大迭代次数
options.tolgradnorm = 1e-6; % 梯度范数的容忍度
% 随机生成初始点
% X0 = problem.M.rand();
% 使用 Manopt 进行 Riemannian manifold 优化
X_opt = trustregions(problem, options);
% 从优化结果中重构 F_RJ
F_RJ_opt = reshape(X_opt, N_t, N_t);
% 显示最优解
disp('Optimal F_RJ:');
disp(F_RJ_opt);
改为正确的代码
% 设置问题参数
N_t = 10; % N_t 的值,根据你的问题设置
w_hat_J = randn(N_t, 1) + 1i * randn(N_t, 1); % 随机生成 w_hat_J
f_BJ = randn(N_t, 1) + 1i * randn(N_t, 1); % 随机生成 f_BJ
% 初始化 Riemannian manifold 结构
manifold = complexcirclefactory(N_t * N_t); % 复单位圆流形
% 定义问题描述
problem.M = manifold;
A = kron(f_BJ.', eye(N_t));
% 定义目标函数
problem.cost = @(vecF_RJ) real((w_hat_J - A * vecF_RJ)' * (w_hat_J - A * vecF_RJ));
% 定义梯度函数
problem.egrad = @(vecF_RJ) -2 * A' * (w_hat_J - A * vecF_RJ);
% 定义Hessian函数
problem.ehess = @(vecF_RJ, u) 2 * A' * A * u;
% 设置优化器选项
options.maxiter = 100; % 最大迭代次数
options.tolgradnorm = 1e-6; % 梯度范数的容忍度
% 随机生成初始点
X0 = problem.M.rand();
% 使用 Manopt 进行 Riemannian manifold 优化
X_opt = trustregions(problem, X0, options);
% 从优化结果中重构 F_RJ
F_RJ_opt = reshape(X_opt, N_t, N_t);
% 显示最优解
disp('Optimal F_RJ:');
disp(F_RJ_opt);