• Manopt使用


    本文记录一些黎曼流型的优化工具箱的使用


    入手

    安装

    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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    改为正确的代码

    % 设置问题参数
    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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    自己手推黎曼流型与之对比

  • 相关阅读:
    【MySQL】索引介绍、索引的数据结构
    WMS仓库管理系统的应用场景有哪些?
    测试老鸟整理,Postman加密接口测试-Rsa/Aes对参数加密(详细总结)
    HTML拖拽
    冷热电气多能互补的微能源网鲁棒优化调度(Matlab代码实现)
    自采集壁纸网页源码
    Linux学习总结
    微服务架构--介绍
    Springboot毕设项目公益众筹管理系统h7sur(java+VUE+Mybatis+Maven+Mysql)
    C++模板总结
  • 原文地址:https://blog.csdn.net/qq_45542321/article/details/134275222