基于jupyter notebook的Python编程
1、线性规划中的单纯形法、大M法的excel求解、python编程求解和python包求解;
2、非线性规划的拉格朗日乘子法的手工数学推导、python编程和python包求解;
一、线性规划问题求解
1、Excel中大M法与Excel的“规划求解”包对实际问题的求解比较
实际例题:
求解以下约束条件的线性规划的最大值和最优解
使用大M法对实际问题的求解
使用Excel的“规划求解”包对实际问题的求解
在Excel中将数据及相应的公式写入到Excel里
通过Excel自带的“规划求解”功能,将结果求解出来
2、Python求解线性规划问题
2.1 新建txt文档,填入线性回归分析标准化模型
新建txt文档,写入标准化模型系数,如下所示
2.2 Python使用单纯法对实际线性规划问题的求解
python 代码如下
import numpy as np
import sys
def solve(d,bn):
while max(list(d[0][:-1])) > 0:
l = list(d[0][:-2])
jnum = l.index(max(l))
m=[]
for i in range(bn):
if d[i][jnum] == 0:
m.append(0.)
else:
m.append(d[i][-1]/d[i][jnum])
inum = m.index(min([x for x in m[1:] if x!=0]))
s[inum-1] = jnum
d[inum] /= d[inum][jnum]
for i in range(bn):
if i != inum:
d[i] -= d[i][jnum] * d[inum]
def printSol(d,cn):
for i in range(cn - 1):
if i in s:
print("x"+str(i)+"=%.2f" %d[s.index(i)+1][-1])
else:
print("x"+str(i)+"=0.00")
print("objective is %.2f"%(-d[0][-1]))
d = np.loadtxt("F:/data.txt", dtype=np.float)
(bn,cn) = d.shape
s = list(range(cn-bn,cn-1))
solve(d,bn)
printSol(d,cn)
运行结果:
x0=0.00
x1=1.00
x2=3.00
x3=0.00
x4=2.00
x5=0.00
x6=0.00
objective is 32.00
2.3 Python使用scipy库对实际线性规划问题的求解
整体代码如下:
from scipy import optimize
import numpy as np
c = np.array([1,14,6])
A_ub = np.array([[1,1,1],[1,0,0],[0,0,1],[0,3,1]])
B_ub = np.array([4,2,3,6])
res =optimize.linprog(-c,A_ub,B_ub)
print(res)
运行结果:
con: array([], dtype=float64)
fun: -31.99999999819265
message: 'Optimization terminated successfully.'
nit: 4
slack: array([6.62327970e-11, 2.00000000e+00, 3.88720167e-10, 3.41993101e-10])
status: 0
success: True
x: array([3.06911596e-10, 1.00000000e+00, 3.00000000e+00])
从代码中可以发现
c:c指的应该是要求最大值的函数的系数数组
A_ub:A_ub是应该是不等式未知量的系数矩阵,也就是不等式左边
B_ub:B_ub就是不等式的右边了,也就是不等式右边
3、结果对比分析
3.1 单纯形法结果
3.2 scipy结果
通过对两个的结果分析,可以看出单纯形法的结果更加具体,因为结果为整数;对于SciPy库,其运算结果为小数,是否更加具体不知道,但是两个的运算结果相差不大,其误差也比较小,所以可以选择忽略。
二、非线性规划问题的求解
1、等式约束下的拉格朗日乘子法
公式推导:这里只是简单的放了一张图片对等式约束下拉格朗日乘子法的求解步骤进行了讲解。
2、Python实现对带约束的非线性规划求解
求解实际例题
2.1 Python编程实现求解
Python代码:
from sympy import *
x1 = symbols("x1")
x2 = symbols("x2")
alpha = symbols("alpha")
L = 60 - 10*x1 - 4*x2 + x1*x1 + x2*x2 - x1*x2 - alpha * (x1 + x2 - 8)
difyL_x1 = diff(L, x1)
difyL_x2 = diff(L, x2)
difyL_alpha = diff(L, alpha)
aa = solve([difyL_x1, difyL_x2, difyL_alpha], [x1, x2, alpha])
print(aa)
运行结果:
{x1: 5, x2: 3, alpha: -3}
2.2 python使用SciPy库实现求解问题
python代码如下:
from scipy.optimize import minimize
import numpy as np
def func(args):
fun = lambda x: 60 - 10*x[0] - 4*x[1] + x[0]**2 + x[1]**2 - x[0]*x[1]
return fun
def con(args):
cons = ({'type': 'eq', 'fun': lambda x: x[0]+x[1]-8})
return cons
if __name__ == "__main__":
args = ()
args1 = ()
cons = con(args1)
x0 = np.array((2.0, 1.0))
res = minimize(func(args), x0, method='SLSQP', constraints=cons)
print(res.fun)
print(res.success)
print(res.x)
运行结果:
17.000000000000007
True
[4.99999994 3.00000006]
3、Python求解结果对比分析
3.1普通法求解结果
3.2 scipy库求解结果
通过两个Python程序的求解结果对比分析,两个的求解结果相差不大,并且误差都在一定范围内,所以可以认为两个的求解结果是一致的。
参考链接:
https://blog.csdn.net/qq_42451251/article/details/105597806
https://blog.csdn.net/kittyzc/article/details/81707464
https://blog.csdn.net/sinat_17697111/article/details/81534935
https://blog.csdn.net/qq_33757398/article/details/82834888?fps=1&locationNum=2