在学习司守奎老师编写的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)个元素赋一次值,正好就是给对角线元素赋值。
至此,也算是弄明白了。学习过程中参考了以下资料,把链接放在这里,感谢其他朋友分享的知识。
python中y和n_花里胡哨!Python中的[:n],[::n],[:,:,n],[...,n]都是什么鬼!文章来源:https://www.toymoban.com/news/detail-430991.html
python对矩阵对角线进行赋值文章来源地址https://www.toymoban.com/news/detail-430991.html
到了这里,关于Python求解二次规划模型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!