无线通信中的优化问题+matlab中cvx的使用心得

前言

    学习期间主要做的是无线通信领域的资源分配问题,特别针对的是类似香农信道容量的 log 形式的优化问题的仿真,有射频通信的,也有无线光通信的。在使用cvx求解的过程中也有一点儿心得体会,在这里记录下来和大家交流探讨,如有错误还请批评指正,此文的前提是要对cvx语法基本了解;
    在仿真期间碰到过各种各样的问题,每个人的问题建模不同,且仿真的具体参数不同,导致问题五花八门,而在中文网站上,很少看到一些解决方法。本次博客针对香农信道容量的优化问题形式,进行记录,因优化问题形式不同,本文仅能写个大概,如果朋友们碰到问题了的话,建议还是优先去cvx官方论坛上查找或提问:cvx_forum,亦或是查看cvx user’s guide 一文(百度可找到);
   对通信理论中信道容量的形式,稍微了解的朋友会知道大概是 这种形式

在这里插入图片描述

1.cvx使用常见小tips

1.1 函数与约束的凹凸性

以下目标函数是凸函数:

  1. maximize 凹函数
  2. minimize 凸函数

以下约束是凸约束:

  1. 凹函数 >= 某一常数
  2. 凸函数 <= 某一常数
    以上原理在boyd的凸优化的书里面,上镜图和下镜凸里有解释。

trace() 函数,因为是求迹,相当于是求矩阵的对角线元素,是个仿射函数 (就是线性的)

如果你的函数比较复杂,一眼看不出其凹凸性。有如下两种方法来验证:

  1. 查阅boyd的凸优化一书,里面给出了几个常见复合函数的凹凸性,也可以观看b站 中科大凌青老师的凸优化课程,讲的非常好!
  2. 利用函数凹凸性的一阶和二阶必要条件,求导来判断。至于如何求导,后文有给出相关方法。
1.2 CVX处理数据的精度
  1. cvx对数据的精度是有要求的,例如上面的有用信号的数值,不能低于10^-12次方。 其实,使得仿真程序中某一块数据的计算值保持在不低于 10^-5 次方,cvx的求解才会很大程度上不会failed;
  2. 有两个方法解决上面的问题。一是归一化,对无线通信而言,噪声都是比信号小至少一个数量级的,我们可以对上面的log函数里面,先通分后,把1去掉,然后分子分母同时除以噪声,相当于把噪声归一化了,这样可以使得函数整体大小不变,同时放大的我们所需要的项。这个方法在无线光通信的理论仿真里面比较常用,因为光通信仿真里面的信道和信号都特别小,差不多是10的负10多次方了。
  3. 第二个个方法就是放缩,即是对 约束两边同时乘以一个很大的系数,这样也可以使得约束整体不变,但要注意这个缩放系数需要小心设置。我碰到的仿真,不加缩放系数,cvx求解为failed。加了不同的缩放系数,所得的结果也可能会不太相同。
  4. 另外你还可以通过设置 cvx_precision 这一选项去调整cvx求解器的默认精度,不过这个方法没怎么在我的仿真中见效。
1.3 CVX中常用的替换函数
  1. 有时可能你无论怎么调整,在程序刚开始的迭代过程中,cvx都是可以求解的,后面突然出现failed,或者程序报 Disciplined convex programming error: Cannot perform the operation 的错误 ,我的经验是缩放系数,或者是实验仿真参数还需要细调。(如果你是采用的迭代算法中是用梯度下降的,你也可以尝试动态调整步长的方法),另外还有如下方法:
  2. 替换常见的的操作符,如:平方的绝对值替换为square_abs()等等,在范数的平方里面多使用abs() ,具体的我记不太清了,具体可查看cvx_guide 一文。
  3. 另外,细心的朋友也会发现,在cvx求解过程中,会出现 CVX"s Successive Approximation method的方法,有时cvx里面的这种凸逼近的方法也会出现问题,导致最后,即使有结果,但结果仍然不满足部分约束。这时你可以采用cvx_quad 这个函数包,去替代你问题中的相关函数,比较常用的例子如下:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    以上三个例子在SCA的方法中,尤其是指数替代中,有大用

附:

  1. cvx_quad 链接:How to use CVXQUAD’s Pade Approximant instead of CVX’s
  2. cvx_quad安装方法,我采用的是特别笨的方法,即把github里所有的函数下载下来,然后全部复制我的优化问题文件里,直接调用即可。没有采用安装指导上所说的解压到set文件里。(因为我试过多次失败了)
1.4 cvx查找可行解

有时我们会碰到原问题太复杂难以直接转化为凸问题,而是采用固定某一变量的方法,用二分查找的方法去不断迭代查找原问题的可行解。
cvx里面求可行解的方法有两种:一是 minimize 0 ,二是 find 优化变量

1.5 cvx更换求解器可能会有意想不到的效果

关于更换求解器,我的这篇文章里有详细的方法,有时采用不用的求解器,的确能得到solved的解。

2.常见的优化问题形式

下面针对我碰到过的这几种优化问题的形式,具体来说

2.1.以最大化多用户 的 和 速率的形式

此情况下,无论是该和速率是作为目标函数,还是作为约束,都不是凸函数的形式,原因是涉及到 log()+log() 的形式,是非凸的。常见解决方法,是采用迭代的方法,即采用 凸差 / 连续凸近似 / MM算法 (这三种算法的思想都是类似的),在每次迭代的过程中,用目标函数的下界(此时是凸的) 去替换原来的目标函数,那么,对每次迭代时,新的目标函数都是凸的,且每次的解出的结果都是原函数的下界。且迭代过程期间所得到解是递增的,多次迭代之后可得到原问题的一个local solution,(该算法思想可查看我之前的文章,有写过);

2.2.以最大化最小公平性问题的形式
  1. 最大化最小的公平性问题,言外之意就是,我们需要去提升 系统中 表现最差的那一个用户,相当于是不断拔高木桶原理中最短的那根木板,使得系统总的性能更好。这类优化问题相对于和速率的问题而言,好解一些。
  2. 在cvx里面,可以采用一个辅助变量,如下,相当于我要求的是 所有的R_i的最小值 t,然后使得这个t 最大。

在这里插入图片描述

2.3.以最小化总发射功率的形式
  1. 这种情况下的优化问题,目标函数是线性函数,是凸的。此时如果约束条件不那么复杂的话,一般可以采用通分,化简消除log函数,可以直接使得问题转换为凸问题来求解;
  2. 如果约束比较复杂的话,可以考虑对约束采用近似的方法,类似于前面提过的凸差/连续凸近似/MM算法去迭代求解。

后记

  1. 针对以上三种形式的优化问题,其中可能会涉及到 波束成形向量的内积问题,是一个二次型优化问题。我们可以采用半正定松弛的方法,把其变为一次优化问题, 这个方法特别经典,在无线通信理论研究中常用。具体可参考 Luo zhiquan 老师的半正定松弛 论文(英文版的)。
  2. 对于多变量的优化问题,目前主流的方法是采用AO交替优化算法,即先固定某一个变量,对另一个变量而言就是凸的了。这样子进行交替求解,最后得到原问题的驻点。思想类似于块坐标下降法。特别地,目前,有些论文采用强化学习的方法,去解这种多变量互相耦合的优化问题或者是场景十分复杂的单变量优化问题,也取得了较好的效果。
  3. 另外,对于通信理论优化的研究中,常见的方法感觉都是基于梯度的,不要局限于不同的算法名字。对了,常用的方法还有 mmse优化,拉格朗日乘子法等等。这些算法对于函数的一阶导数甚至于二阶导数都需要一定的计算。关于矩阵函数求导的方法,我这里放上两篇文章,加上一个在线计算器,希望能帮到你。
  • The Matrix Cookbook (求导查询书,可查询相关矩阵函数的导数)
  • Matrix Calculus: Derivation and Simple Application HU, Pili(也可以知乎搜索 矩阵求导术-来自这篇论文)
  • 矩阵演算在线网站,我用它来双向验证我推导公式的正确性。
  • 也可以参考张贤达老师的 矩阵分析与应用 一书

以上资源也可以从我的阿里云盘里免费下载
链接:https://www.aliyundrive.com/s/7PBGKUigheX

调程序是一件无聊且枯燥的事,希望看到这的朋友们多发顶刊,前程似锦!码字不易,觉得有帮助的可以点赞收藏,有问题随时留言我看到了会及时回复,如有错误还请批评指正!

  • 212
    点赞
  • 569
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 113
    评论
以下是使用 MATLABCVX 工具箱实现单无人机通信与轨迹优化的代码示例: ```matlab % 通信覆盖半径 R = 5; % 无人机最大速度 Vmax = 10; % 无人机起始位置 x0 = 0; y0 = 0; % 无人机目标位置 xt = 50; yt = 50; % 时间间隔 dt = 0.1; % 通信时间 tau = 1; % 无人机数量 N = 1; % 求解优化问题 cvx_begin % 无人机轨迹 variable x(N, length(0:dt:tau)); variable y(N, length(0:dt:tau)); % 无人机速度 variable vx(N, length(0:dt:tau)); variable vy(N, length(0:dt:tau)); % 最小化总时间 minimize(sum(sum(sqrt(vx.^2 + vy.^2))) * dt); % 起始位置和速度 x(:,1) == x0; y(:,1) == y0; vx(:,1) == 0; vy(:,1) == 0; % 目标位置 x(:,end) == xt; y(:,end) == yt; % 速度限制 norm([vx; vy], 'fro') <= Vmax; % 通信覆盖半径限制 for i = 1:length(0:dt:tau) for j = 1:N for k = 1:N if k ~= j norm([x(j,i) - x(k,i); y(j,i) - y(k,i)]) <= R; end end end end cvx_end % 绘制无人机轨迹 plot(x', y', '-o'); xlabel('X'); ylabel('Y'); title('Drone Trajectory'); ``` 在这个示例,我们使用 CVX 工具箱来求解单无人机通信和轨迹优化问题。我们需要指定通信覆盖半径,无人机最大速度,起始位置,目标位置,时间间隔,通信时间和无人机数量。我们使用 `cvx_begin` 定义了一个优化问题,包括变量 `x` 和 `y` 表示无人机的轨迹,变量 `vx` 和 `vy` 表示无人机的速度,以及目标函数和约束条件。我们最小化总时间,并设置起始位置和速度,目标位置,速度限制和通信覆盖半径限制。然后我们使用 `cvx_end` 求解优化问题,并在绘制无人机轨迹。 请注意,这只是一个简单的示例,你可以根据你的需要修改参数和约束条件,以实现不同的通信和轨迹优化问题。此外,CVX 工具箱是一个强大的工具,可以解决许多其他类型的优化问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 113
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

通信仿真爱好者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值