赞
踩
在学习司守奎老师编写的Pyhon数学实验与建模。学到第6.6求解二次规划模型的时候,忽然觉得很多地方又看不懂了,之前学的一些都忘记了,所以又赶紧查资料弥补一下知识。放在这里,给后面学习的小伙伴提供一些参考吧。
- import numpy as np
- from cvxopt import matrix,solvers
- n=3;
- P=matrix(0.,(n,n))
- P[::n+1]=[3,2,1.7]
- q=matrix([3,-8.2,-1.95])
- A=matrix([[1.,0,1],[-1,2,0],[0,1,2]]).T
- b=matrix([2.,2,3])
- Aeq=matrix(1.,(1,n))
- beq=matrix(3.)
- s=solvers.qp(P,q,A,b,Aeq,beq)
- print("最优解为:",s['x'])
- print("最优值为:",s['primal objective'])
详细拆解一下当时遇到的问题
P=matrix(0.,(n,n))
此处用到的matrix是cvxopt库里面的,其一般格式为:cvxopt.matrix(array,dims),表示把array按照dims重新排成矩阵。则上面那行代码里面的(n,n)表示的是一个n×n的维度。0后面的点,表示设置为浮点数。matrix里区分int和double,所以数字后面都需要加小数点
需要注意的是cvxopt.matrix与numpy.matrix的排列顺序不同,其中cvxopt.matrix是列优先,numpy.matrix是行优先。举例说明如下:
- from cvxopt import matrix
- >>> A = matrix([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], (2,3))
- >>> print(A)
- [ 1.00e+00 3.00e+00 5.00e+00]
- [ 2.00e+00 4.00e+00 6.00e+00]
- >>> A.size
- (2, 3)
这个程序中,最让让我原地爆炸的是这一行代码
P[::n+1]=[3,2,1.7]
这一行代码的主要作用是把3,2,1.7的数值赋给P矩阵的对角线元素,但是由于自己把之前学的知识都忘得差不多了,所以半天没想明白是怎么回事,花了一两天时间查资料,终于弄懂,开心飞起!
举例而言:
比如a=[0,3,8,11,15,16,20,17,28]
其实list[::]的意思是list[start:end:step],其中,
-start:起始位置,默认=0;
-end:结束位置,默认=list的长度;
-step:步长,默认=1;
因此,a[::]就相当于是从a的第一个元素开始,到最后一个元素为止,一步一步的输出a的所有元素。
a[::2] (等价于a[0:len(a):2])就是每两跳输出一个值,即[0, 8, 15, 20, 28]。
因此,P[::n+1],表示的是在P矩阵中,从第一个元素开始,每隔4(n+1)个元素赋一次值,正好就是给对角线元素赋值。
至此,也算是弄明白了。学习过程中参考了以下资料,把链接放在这里,感谢其他朋友分享的知识。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。