线性/非线性规划问题求解

目录


用Excel和python编程完成线性规划问题的求解
问题
现有5个广告投放渠道:日间电视、夜间电视、网络媒体、平面媒体、户外广告。
每个渠道的效果、广告费用、限制数据如下表:

在这里插入图片描述
在这里插入图片描述

Excel 线性规划
首先使用 Excel 2016 建立一个数据表:
在这里插入图片描述
设置目标函数:

根据上面分析,目标函数为:E2:E6与F2:F6区域的乘积。
在 C10 单元格内输入:=SUMPRODUCT(E2:E6,F2:F6)
在这里插入图片描述
入完毕后,值为 0 ,因为 F 那一列值为空,这里我在前面备注了一下。
在这里插入图片描述
设置约束条件:

将第一部分所写的约束条件表达式设置在 Excel 中。
在 C15:C18 单元格内依次输入公式:
C15:=SUMPRODUCT(C2:C3,F2:F3)
C16:=F2+F3
C17:=SUMPRODUCT(C2:C6,F2:F6)
C18:=SUMPRODUCT(B2:B6,F2:F6)
输入完毕后均为 0 。
在这里插入图片描述
加载 Excel 的规划求解模块:

选择【文件】→【选项】→【加载项】→【转到】,勾选【规划求解加载项(Solver add-in)】,再点击【确定】按钮,就出现了规划求解模块。
在这里插入图片描述
在 Excel 规划求解模块中设置决策变量和目标函数:

打开规划求解。
修改以下两个值:
(1)设置目标:输出结果区域;
(2)通过更改可变单元格:也就是之前数据表空白的地方
在这里插入图片描述
设置约束条件:
点击【添加】按钮,分别设置 6 个约束条件。
在这里插入图片描述
约束条件 1——电视广告费用不超过 3 万元在这里插入图片描述
在这里插入图片描述
约束条件 2——电视广告次数至少进行 20 次
在这里插入图片描述
约束条件 3——广告总费用不超过 4 万元
在这里插入图片描述
约束条件 4——被告知人数至少 10 万人
在这里插入图片描述
约束条件 5——各媒体使用次数不超过次数限量在这里插入图片描述
约束条件 6——各媒体使用次数均为正整数
在这里插入图片描述
在这里插入图片描述

求解问题:

约束条件设置完毕后,设置【单纯线性规划】,然后点击【求解】。
在这里插入图片描述
点击【确定】。
在这里插入图片描述
结果如下:
在这里插入图片描述

python 编程线性规划
scipy 库中线性规划求解函数的说明:
函数原型

scipy.optimize.linprog(c,
A_ub=None,
b_ub=None,
A_eq=None,
b_eq=None,
bounds=None,
method=‘interior_point’,
callback=None,
options=None,x0=None)​

使用 Jupter 编写代码:

# 导入包
from scipy import optimize
import numpy as np
#创建矩阵,c为目标函数的矩阵,A_ub为约束条件的左边构成的矩阵,B_ub为约束条件的右边
c=np.array([600,800,500,400,300])
A_ub=np.array([[1000,2000,0,0,0],[-1,-1,0,0,0],[1000,2000,400,1000,100],[-2000,-4000,-3000,-5000,-600],[1,0,0,0,0],[0,1,0,0,0],[0,0,1,0,0],[0,0,0,1,0],[0,0,0,0,1]])
B_ub=np.array([30000,-20,40000,-100000,14,8,40,5,50])
# 求解
res=optimize.linprog(-c,A_ub,B_ub)
print(res)

在这里插入图片描述
一样的可以得到结果。
用拉格朗日方法求解,手工求解和编程求解
问题
给定椭球
在这里插入图片描述
求这个椭球的内接长方体的最大体积。
这个问题实际上就是条件极值问题,即在条件
在这里插入图片描述
下求解
在这里插入图片描述
的最大值
拉格朗日手工求解
拉格朗日函数:
在这里插入图片描述
其中 f ( x ) f(x) f(x)为原来的目标函数,j 表示第 j个等式约束系数
构造本题的拉格朗日函数如下:
在这里插入图片描述

对每个变量进行求偏导,得到一个关于变量的方程组如下:

在这里插入图片描述
求解得结果:
在这里插入图片描述
带入目标函数:
在这里插入图片描述
拉格朗日 python 编程求解
使用 Jupyter 编写 python 代码:

# 导入包
from sympy import *
# 设置变量
x,y,z,k = symbols('x,y,z,k')
a,b,c=symbols('a,b,c')
f = 8*x*y*z
g = x**2/a**2+y**2/b**2+z**2/c**2-1
#构造拉格朗日函数
L=f+k*g
#求导
dx = diff(L, x)   # 对x求偏导
print("dx=",dx)
dy = diff(L,y)   #对y求偏导
print("dy=",dy)
dz = diff(L,z)   #对z求偏导
print("dz=",dz)
dk = diff(L,k)   #对k求偏导
print("dk=",dk)
dx= 8*y*z + 2*k*x/a**2
dy= 8*x*z + 2*k*y/b**2
dz= 8*x*y + 2*k*z/c**2
dk= -1 + z**2/c**2 + y**2/b**2 + x**2/a**2
#求出个变量解
m= solve([dx,dy,dz,dk],[x,y,z,k])   
print(m)
#变量赋值
x=sqrt(3)*a/3
y=sqrt(3)*b/3
z=sqrt(3)*c/3
k=-4*sqrt(3)*a*b*c/3
#计算方程的值
f = 8*x*y*z
print("方程的最大值为:",f)

输出结果:
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值