当前位置:   article > 正文

Python求解二次规划模型_python 二次规划

python 二次规划

        在学习司守奎老师编写的Pyhon数学实验与建模。学到第6.6求解二次规划模型的时候,忽然觉得很多地方又看不懂了,之前学的一些都忘记了,所以又赶紧查资料弥补一下知识。放在这里,给后面学习的小伙伴提供一些参考吧。

  1. import numpy as np
  2. from cvxopt import matrix,solvers
  3. n=3;
  4. P=matrix(0.,(n,n))
  5. P[::n+1]=[3,2,1.7]
  6. q=matrix([3,-8.2,-1.95])
  7. A=matrix([[1.,0,1],[-1,2,0],[0,1,2]]).T
  8. b=matrix([2.,2,3])
  9. Aeq=matrix(1.,(1,n))
  10. beq=matrix(3.)
  11. s=solvers.qp(P,q,A,b,Aeq,beq)
  12. print("最优解为:",s['x'])
  13. 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是行优先。举例说明如下:

  1. from cvxopt import matrix
  2. >>> A = matrix([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], (2,3))
  3. >>> print(A)
  4. [ 1.00e+00 3.00e+00 5.00e+00]
  5. [ 2.00e+00 4.00e+00 6.00e+00]
  6. >>> A.size
  7. (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]都是什么鬼!

python对矩阵对角线进行赋值

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/593226
推荐阅读
相关标签
  

闽ICP备14008679号