BUPT丶云卷云舒 2021-07-01 00:13 采纳率: 100%
浏览 209
已结题

如何使用scipy.optimize.minimize来直接对方程组进行优化求解?

最近在做基于tdoa的室内目标定位的研究,主要是做chan算法定位方面的东西,但是做了实验之后发现效果不太稳定。师哥发给我一份他改写的scipy.optimize.minimize的函数,说是用这个就可以定出位置,然后让我好好看一看,最好能看懂,如下(注释是我自己写的,不知道都对不对)

def opt_location(range, anchors):               #range是真实测得的toa

    def con():
        # 约束条件 分为eq 和ineq
        # eq表示 函数结果等于0 ; ineq 表示 表达式大于等于0
        x1min, x1max, x2min, x2max = -5, 15, -5, 15
        cons = ({'type': 'ineq', 'fun': lambda x: x[0] - x1min},              #x[0]-x1min >= 0
                {'type': 'ineq', 'fun': lambda x: -x[0] + x1max},
                {'type': 'ineq', 'fun': lambda x: x[1] - x2min},
                {'type': 'ineq', 'fun': lambda x: -x[1] + x2max})
        return cons                # **************我也不知道为什么约束条件要这么设置

    def cost(pos):                 #***************
        ref = np.sqrt(np.sum((anchors-pos.reshape(1,2))**2, axis=1))         #anchors为四个基站的位置,pos为要优化的位置
        ref0 = ref[1:] - ref[0]
        ref1 = ref[2:] - ref[1]
        ref2 = ref[3:] - ref[2]                            #tdoa
        Ri_0 = range[1:] - range[0]
        Ri_1 = range[2:] - range[1]                
        Ri_2 = range[3:] - range[2]                        #真实测得的tdoa
        return np.sum((Ri_0 - ref0)**2) + np.sum((Ri_1 - ref1)**2) + np.sum((Ri_2 - ref2)**2)    #目标函数的目的是要求所估计位置和各基站的tdoa
                                                                                                  #和真实测得的tdoa相差最小

    x0 = np.array([5, 5])
    res = minimize(cost, x0, constraints=con()).x
    return res

之后,我的任务参照这个函数的优化方式,把chan算法的核心方程组(线性方程组)用这个优化算法求解出来,如图红框

img 这篇关于chan算法的csdn博客的链接是:https://blog.csdn.net/qq_23947237/article/details/82715784 由于之前没有接触过优化方面的东西,所以我没有思路,师哥说让我找出来目标函数和约束条件,然后依葫芦画瓢就行,但是我还是一头雾水,希望大佬可以帮忙解决!下面是我最后通过chan算法的第一次ls粗略位置估计得出Za0的代码,我的任务就是把这个Za0用优化的方式求出来

from math import *
from numpy import *
import numpy as np
from numpy.linalg import inv, qr
BSN = 4 #基站数目
BS=np.array([[0,0,10,10,-sqrt(3),dot(- 0.5,sqrt(3)),dot(0.5,sqrt(3))],[0,10,10,0,0,-1.5,-1.5]]) #锚点位置
BS=BS[:,:BSN] #取前4#BS=multiply(BS,50)   #数值×50 四个基站位置固定
print("-----------------------------BS--------------------------------")
print(BS)            #看看基站位置
MS=np.array([10,4]) #设置移动台初始位置
print("-----------------------------MS--------------------------------")
print(MS)            #看看移动台位置
R0=[]                #R0为四个锚点分别到移动台的距离
R0.clear()           #清空R0
for i in range(0,BSN):
    R0.append(sqrt((BS[(0,i)] - MS[0]) ** 2 + (BS[(1,i)] - MS[1])**2))#计算基站到移动台的距离
R0 = np.array(R0)    #转换为矩阵
print("-----------------------------R0--------------------------------")
print(R0)
Noise = 1            #噪声方差
R = []
R.clear()
a = random.random(3)
r = np.zeros(3)
for i in range(0,3):
    r[i]=2*a[i]-1  #随机生成一个-11的数
for i in range(1,BSN):  
    R.append(R0[i]-R0[0]+Noise*r[i-1])#计算距离差 R2-R1 R3-R1 R4-R1 并加噪声
R = np.array(R)     #转换为矩阵
print("-----------------------------R--------------------------------")
print(R)            #BSN BS R都有了,开始进行算法部分

Q = eye(BSN-1)
print("-----------------------------Q--------------------------------")
print(Q)
K1 = 0
k = (BS**2).sum(0) #BS各基站的x平方+y平方
print("-----------------------------K--------------------------------")
print(k)
Ga = np.array([[1.0,1.0,1.0],[1.0,1.0,1.0],[1.0,1.0,1.0]])  #弄一个3*3的矩阵
for i in range(0,BSN-1):
    Ga[i][0] = -BS[0][i+1]
    Ga[i][1] = -BS[1][i+1]
    Ga[i][2] = -R[i]
print("-----------------------------Ga--------------------------------")
print(Ga)
h = []
for i in range(0,BSN-1):
    h.append(0.5*(R[i]**2-k[i+1]+K1))
h = np.array(h)
print("-----------------------------h--------------------------------")
print(h)
Za0 = inv((Ga.T).dot(inv(Q)).dot(Ga)).dot((Ga.T).dot(inv(Q)).dot(h.T))  #第一次粗略估计的位置,使用这个值来估计B
print("-----------------------------Za0--------------------------------")
print(Za0)

主要是不知道思路和怎么写代码,麻烦了,谢谢!

  • 写回答

2条回答 默认 最新

  • 有问必答小助手 2021-07-02 16:38
    关注

    你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答

    本次提问扣除的有问必答次数,已经为您补发到账户,我们后续会持续优化,扩大我们的服务范围,为您带来更好地服务。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月30日

悬赏问题

  • ¥15 安装svn网络有问题怎么办
  • ¥15 Python爬取指定微博话题下的内容,保存为txt
  • ¥15 vue2登录调用后端接口如何实现
  • ¥65 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥15 latex怎么处理论文引理引用参考文献