我的编程空间,编程开发者的网络收藏夹
学习永远不晚

解读python cvxpy下SDP问题编程

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

解读python cvxpy下SDP问题编程

python cvxpy下SDP问题编程

最近在做定位算法的复现问题,遇到了

Source Localization in Wireless Sensor Networks From Signal Time-of-Arrival Measurements

里面的一个半正定优化算法,因此选用cvxpy库实现。

官方文档[cvxpy]的例程复现的算法都很简单,因此对该问题的借鉴意义不大。

算法如下


对我而言,首先的难度就是拼接矩阵后的半正定约束条件,起初是另设立两个矩阵变量,然后按部就班的增加限制条件。但最后求得的数据千奇百怪,与预测位置没有任何关系。

后来不断尝试更改约束限制的表达形式,但均无效果。

后来输出了每个变量的值查看,发现Q元素的物理意义为预测距离的平方,但是求出来的Q矩阵元素往往极大,因此擅自添加了一个约束条件,限制Q的最大元素在预测距离平方的量级上,完美解决问题。

附上代码

class Program_t:

    def __init__(self,bt):
        self.BT = bt
        self.BT_x = [b[0] for b in self.BT]
        self.BT_y = [b[1] for b in self.BT]
        self.T=[b[2] for b in self.BT]
        self.number = len(bt)
        
    def LS_steps(self):
        num = len(self.T)
        up_control = 2*max(self.T)**2#限制最大元素量级
        Q = cp.Variable((num,num))#待求变量
        tao = cp.Variable((num,1))#生成矩阵形式后面才可以拼接
        y_ = cp.Variable((2,1))
        y_s = cp.Variable((1,1))#矩阵形式用于拼接
        yita = 0.000005*sum(self.T) / num#论文给出的参数选择,可更改常数
        G = np.eye(num)-np.ones((num,num))
        t = np.array([self.T]).T
        expr1 = cp.trace((cp.transpose(G)) @ G @ (Q- cp.multiply(2,t @ (cp.transpose(tao)))+t @ (cp.transpose(t))))
        expr2 = yita*cp.sum(Q)
        expr = expr1+ expr2#目标函数
        Q_ = cp.bmat([[Q,tao],[cp.transpose(tao),[[1]]]])#拼接矩阵
        Y = cp.bmat([[np.eye(2),y_],[cp.transpose(y_),y_s]])#拼接矩阵
        constraints = [Q_ >> 0, Y >> 0, cp.max(Q)<=up_control]#限制条件Q半正定,Y半正定,Q最大元素小于上限(这个约束非常重要,是我自己加上去的)
        for i in range(num):
            X = np.array([self.BT_x[i],self.BT_y[i],-1]).T
            constraints += [Q[i, i] == cp.transpose(X) @ Y @ X]#约束条件
            for j in range(i+1,num):
                X_j = np.array([self.BT_x[j], self.BT_y[j],-1]).T
                constraints += [Q[i, j] >= cp.abs(cp.transpose(X) @ Y @ X_j)]#约束条件
        obj = cp.Minimize(expr)
        prob = cp.Problem(obj, constraints)
        prob.solve()
        position = y_.value
        print(expr1.value)#输出值
        print(expr2.value)
        print(prob.value)#输出值
        print(prob.status)#输出状态
        print(position)
        return position
       	

总结

1.理论算法与编程实现永远不等,不能轻易照搬,具体实现过程中要结合实际情况进行考虑,当求得的结果与预计相差很多时,可以尝试增加数值约束,因为计算机仿真只是近似,不是理论上的完美条件。

2.编程实现调用库时,最好按照库的标准写,如本例中矩阵点乘可以用numpy 的dot或者cvxpy的@,以及转置的.T和cp.transpose().但是dot有时会产生意想不到的情况,平白增加工作量。

3.复现算法时必须要对算法有深入理解,否则难以发现问题所在。

4.不要轻易怀疑工具包的问题,经过大量使用的工具包一定比你的感觉可靠。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

解读python cvxpy下SDP问题编程

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

解读python cvxpy下SDP问题编程

这篇文章主要介绍了解读python cvxpy下SDP问题编程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-12-17

C++在vscode中的多文件编程问题解读

这篇文章主要介绍了C++在vscode中的多文件编程问题解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-01-06

python编译pyc工程--导包问题解

利用python 编译工程,生产pyc文件pyc文件好处:是一种二进制机器码,并且隐藏了源文件代码,但是有和py文件一样的功能(可以理解为效果一样)                        所以可以将代码隐藏,便于商业价值,保护代码隐
2023-01-31

Python中的并行编程问题及解决方案

Python中的并行编程问题及解决方案,需要具体代码示例随着多核处理器的普及和计算任务的复杂化,以及数据处理方面的需求增加,利用并行编程可以有效地提高程序的执行效率。Python作为一种高级编程语言,具有简洁、易读、易写的特点,也提供了一些
2023-10-22

Python 网络编程常见问题及解决方法

本文总结了 Python 网络编程中常见的几个问题及其解决方法,并提供了相应的演示代码,对 Python 网络编程的开发者们具有参考价值。
Python 网络编程常见问题及解决方法
2024-02-13

python编程学习np.float被删除的问题解析

这篇文章主要为大家介绍了python编程学习np.float被删除的问题解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-02-06

数据库编程中的Python问题及解决方法

数据库编程中的Python问题及解决方法引言:在现代软件开发中,数据库是不可或缺的一部分。Python作为一门功能强大的编程语言,可以与多种数据库进行交互和操作。然而,在数据库编程过程中,我们可能会遇到一些问题。本文将介绍一些常见的Pyth
2023-10-22

Python中多进程编程的常见问题及解决策略

Python中多进程编程的常见问题及解决策略引言:随着计算机硬件的不断发展,多核处理器已经变得越来越常见。为了充分利用硬件资源,提高程序的执行效率,多进程编程成为了一个重要的技术。但是在使用多进程编程时,我们也常常会遇到一些问题,比如进程间
2023-10-22

多进程编程中遇到的Python问题及解决方法

多进程编程中遇到的Python问题及解决方法,需要具体代码示例在Python中,多进程编程是一种常用的并发编程方式。它可以有效利用多核处理器的优势,提高程序的运行效率。然而,在进行多进程编程时,我们也会遇到一些问题。本文将介绍几个常见的问题
2023-10-22

多线程编程中遇到的Python问题及解决方案

多线程编程中遇到的Python问题及解决方案在进行多线程编程时,我们常常会遇到一些与线程同步、资源竞争和死锁等相关的问题。本文将介绍一些常见的Python多线程编程问题,并提供相应的解决方案和代码示例。线程同步问题多个线程可能同时访问共享资
2023-10-22

多线程编程中遇到的Python问题及解决方法

多线程编程中遇到的Python问题及解决方法Python是一种广泛使用的编程语言,它有许多优点,其中之一就是可以通过多线程来提高程序的执行效率。然而,在多线程编程中,也会遇到一些常见的问题。本文将讨论一些常见的多线程编程问题,并提供相应的解
2023-10-22

Python中多进程编程的常见问题及解决方案

Python中多进程编程的常见问题及解决方案摘要:随着计算机硬件的发展,多核处理器已成为计算机的常态。因此,充分利用多核处理器的能力是提高程序性能的关键。在Python中,多进程编程是一种利用多核处理器的有效方法。然而,多进程编程也会面临一
2023-10-22

20个解决日常编程问题的Python代码分享

在这篇文章中,主要和大家分享了20个Python代码片段,以帮助你应对日常编程挑战。文中的示例代码讲解详细,感兴趣的小伙伴可以跟上小编一起了解一下
2023-01-28

异步编程中遇到的Python问题及解决策略

异步编程是一种利用非阻塞的方式处理多个任务的编程方法。它能够提高程序的性能和响应速度,特别适用于网络请求、IO操作等耗时任务。在Python中,通过使用异步库如asyncio和aiohttp,可以实现高效的异步编程。然而,在实际应用中,我们
2023-10-22

网络编程中遇到的Python问题及解决方案

网络编程中遇到的Python问题及解决方案在现代的互联网时代,网络编程扮演着非常重要的角色。而Python作为一门简洁而强大的编程语言,也被广泛应用于网络编程中。然而,在实践中,我们常常会遇到一些问题。本文将介绍一些在网络编程中常见的Pyt
2023-10-22

Python编程语言如何解决常见的实际问题

本篇文章为大家展示了Python编程语言如何解决常见的实际问题,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Python编程语言是一种广为应用的计算机语言,但是还是有很多人堆Python编程语言的相
2023-06-17

并行编程中遇到的Python问题及解决策略

标题:并行编程中遇到的Python问题及解决策略摘要:随着计算机技术的不断发展,对于数据处理和计算能力的需求越来越大。并行编程成为提高计算效率的重要方式之一。在Python中,我们可以利用多线程、多进程和异步编程等方式实现并行计算。然而,并
2023-10-22

Python网络编程中的常见问题及解决方法

Python网络编程中的常见问题及解决方法引言:在当今互联网时代,网络编程成为了一项重要的技能。Python作为一种功能强大而易学的编程语言,得到了广泛的应用。然而,网络编程中常常会遇到一些问题。本文将介绍一些常见的问题,并给出相应的解决方
2023-10-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录