• 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

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

  • 相关阅读:
    基于Java+SpringBoot+Thymeleaf+Mysql在线电子书阅读系统学习系统设计与实现
    Qt 项目实战 | 音乐播放器
    zookeeper学习记录
    数据结构与算法笔记:基础篇 - 数组:为什么数组都是从0开始编号
    【图像分类】【深度学习】【Pytorch版本】AlexNet模型算法详解
    Laravel 多语言项目开发
    Webmin -- Users和Groups
    MySQL基础篇(一)-- SQL基础
    Nacos的使用记录
    JAVA入坑之Junit测试与断言
  • 原文地址:https://blog.csdn.net/qq_45542321/article/details/134275222