目录
一、代数模型(Algebraic Models)详解
这个线性规划的数学模型很少,但是大家可以培养自己建模的思路,可以参考案例2、案例3,使用pulp非常直观的可以表示所建立的模型以及添加的约束条件。
1.1什么是代数模型?
代数模型是一种利用代数方程(如线性方程、多项式方程等)描述变量之间关系的数学模型。它通常用于描述静态系统或在某一时刻的系统状态。代数模型可以是线性或非线性的,具体取决于变量之间的关系类型。
1.2代数模型的基本形式
代数模型可以用以下一般形式表示:
-
线性模型:
线性代数模型通过线性方程来描述变量之间的线性关系。
例如,一个典型的线性模型形式如下:y = a 1 x 1 + a 2 x 2 + ⋯ + a n x n + b \ y = a_1x_1 + a_2x_2 + \cdots + a_nx_n + b y=a1x1+a2x2+⋯+anxn+b
其中, y y y 是因变量, x 1 , x 2 , … , x n x_1, x_2, \ldots, x_n x1,x2,…,xn 是自变量, a 1 , a 2 , … , a n a_1, a_2, \ldots, a_n a1,a2,…,an 是系数, b b b 是常数项。
-
多项式模型:
多项式模型是描述变量之间多项式关系的模型,其形式为:y = a 0 + a 1 x + a 2 x 2 + ⋯ + a n x n \ y = a_0 + a_1x + a_2x^2 + \cdots + a_nx^n y=a0+a1x+a2x2+⋯+anxn
其中, x x x 是自变量, a 0 , a 1 , … , a n a_0, a_1, \ldots, a_n a0,a1,…,an 是多项式的系数。
1.3 安装所需要的Python包–运行下述案例
运行下述代码:
# 1.激活前文所配置的虚拟环境(不会的参考此专栏另一篇博客)
conda activate mathbuild2 # mathbuild2是你自己创建的虚拟环境,名字和你前面跟随教程创建的名字一样
# 2.安装所需的python包
pip install sympy scipy
运行结果如下:
验证是否成功安装:
# 复制下述代码,粘贴进anaconda prompt,然后回车
# 进入python
python
# 导入包
import sympy
import scipy
# 打印版本
print("SymPy 版本:", sympy.__version__)
print("SciPy 版本:", scipy.__version__)
运行结果如下图:,若出现版本号,则说明成功安装!
1.4代数模型的应用案例
案例 1:市场供需平衡模型
市场供需平衡模型用于描述市场上商品的供给量和需求量之间的关系。例如,设市场上的商品供给量 Q s Q_s Qs 和需求量 Q d Q_d Qd 分别由以下两个线性方程表示:
Q s = c s + d s P \ Q_s = c_s + d_s P Qs=cs+dsP
Q d = c d − d d P \ Q_d = c_d - d_d P Qd=cd−ddP
其中, P P P 是价格, c s , d s , c d , d d c_s, d_s, c_d, d_d cs,ds,cd,dd 是已知参数。市场均衡时,供给量等于需求量,即 Q s = Q d Q_s = Q_d Qs=Qd。求解上述方程可得市场均衡价格和数量。
Python求解代码
以下是使用Python求解该代数模型的代码示例:
from sympy import symbols, Eq, solve
# 定义符号变量
P = symbols('P')
# 已知参数
c_s = 50 # 供给的常数项
d_s = 3 # 供给的价格系数
c_d = 200 # 需求的常数项
d_d = 2 # 需求的价格系数
# 定义供给和需求方程
Q_s = c_s + d_s * P
Q_d = c_d - d_d * P
# 市场均衡条件 Q_s = Q_d
equation = Eq(Q_s, Q_d)
# 求解均衡价格
equilibrium_price = solve(equation, P)[0]
equilibrium_quantity = Q_s.subs(P, equilibrium_price)
# 输出结果
print(f"市场均衡价格: {equilibrium_price:.2f}")
print(f"市场均衡数量: {equilibrium_quantity:.2f}")
Python求解结果如下图:
案例 2:运输问题中的线性规划模型
在物流运输问题中,目标是找到最小成本的运输方案。该问题可以用线性规划模型表示,其中决策变量表示各运输路线的货物量,目标函数表示总运输成本,约束条件表示各个供应地和需求地的供需平衡。
假设有2个供应地和2个需求地,运输成本如下表:
需求地1 | 需求地2 | |
---|---|---|
供应地1 | 4 | 6 |
供应地2 | 8 | 7 |
供应量和需求量分别为:
- 供应地1:50单位
- 供应地2:60单位
- 需求地1:30单位
- 需求地2:80单位
进行数学建模分析
1. 目标函数
我们希望最小化总运输成本:
Minimize Z = 4 x 1 + 6 x 2 + 8 x 3 + 7 x 4 \text{Minimize } Z = 4x_1 + 6x_2 + 8x_3 + 7x_4 Minimize Z=4x1+6x2+8x3+7x4
其中:
- x 1 x_1 x1是从供应地1到需求地1的运输量
- x 2 x_2 x2是从供应地1到需求地2的运输量
- x 3 x_3 x3是从供应地2到需求地1的运输量
- x 4 x_4 x4 是从供应地2到需求地2的运输量
2. 约束条件
我们有如下约束条件:
- 供应地1的总供应量不超过50单位:
0 < x 1 + x 2 < = 50 0 < x_1 + x_2 <= 50 0<x1+x2<=50
- 供应地2的总供应量不超过60单位:
0 < x 3 + x 4 < = 60 0 < x_3 + x_4 <= 60 0<x3+x4<=60
- 需求地1的总需求量必须是30单位:
x 1 + x 3 = 30 x_1 + x_3 = 30 x1+x3=30
- 需求地2的总需求量必须是80单位:
x 2 + x 4 = 80 x_2 + x_4 = 80 x2+x4=80
Python求解代码
使用线性规划库 Pulp
求解此运输问题的代码如下:
Pulp非常好用,非常直观,安装代码如下:
pip install pulp
安装结果如下:
#导入pulp里面的子函数,库
from pulp import *
#创建求取问题的变量,也就是求取的函数的名字,+求取的是最大值还是最小值
# #Min:LpMinimiza;Max:LpMaximize
#Max_Z = LpProblem("Max",LpMaximize)
Min_Z = LpProblem("Min", LpMinimize)
#定义变量
# X = ['x1','x2','x3']
# sales = LpVariable.dicts("sales",X,lowBound=0,cat=LpInteger) #upBoard ,LpContinuous连续,LpInteger整数
x1 = LpVariable("x1",lowBound=0,upBound=None,cat=LpContinuous)
x2 = LpVariable("x2",lowBound=0,upBound=None,cat=LpContinuous)
x3 = LpVariable("x3",lowBound=0,upBound=None,cat=LpContinuous)
x4 = LpVariable("x4",lowBound=0,upBound=None,cat=LpContinuous)
#定义目标函数
Min_Z += 4*x1+6*x2+8*x3+7*x4
#添加约束条件
Min_Z += x1+x2 <=50
Min_Z += x3+x4 <=60
Min_Z += x1+x3 ==30
Min_Z += x2+x4 ==80
Min_Z += x1 >=0
Min_Z += x2 >=0
Min_Z += x3 >=0
Min_Z += x4 >=0
#求解问题
Min_Z.solve()
#输出求解结果
status = LpStatus[Min_Z.status]
#status 表示求解的状态,Optimal表示最优解,Infeasible表示无可行解,(Unbounded表示无界解)
solution = value(Min_Z.objective)
#,solution表示求解到解,Max_Z的值
print("Sales:",status)
print("Max_Z = ",solution)
#获取x1,x2,x3的值
x1 = value(x1)
x2 = value(x2)
x3 = value(x3)
x4 = value(x4)
print("x1 = ",x1)
print("x2 = ",x2)
print("x3 = ",x3)
print("x4 = ",x4)
print('Min_Z = ',4*x1+6*x2+8*x3+7*x4)
Python求解结果如下图:
案例 3:电路分析中的欧姆定律应用
在简单的电路分析中,欧姆定律( V = I R V = IR V=IR)描述了电阻 R R R 两端的电压 V V V 和电流 I I I 的线性关系。多个电阻组成的电路可以表示为一组线性方程,通过求解这些方程可以计算电路中的电流和电压分布。
进行数学建模分析
1. 目标函数
在这个问题中,目标函数可以是最小化或最大化通过电阻的电流,或者我们可以构造一个合适的目标函数来满足欧姆定律。这里,我们假设目标是最小化总电流 (I = I_1 + I_2),以满足给定的电压条件:
Minimize I = I 1 + I 2 \text{Minimize } I = I_1 + I_2 Minimize I=I1+I2
2. 约束条件
根据欧姆定律和电路的特性,我们有以下约束条件:
对于电阻 (R_1) 和 (R_2) 的欧姆定律:
V
=
I
1
⋅
R
1
和
V
=
I
2
⋅
R
2
V = I_1 \cdot R_1 \quad \text{和} \quad V = I_2 \cdot R_2
V=I1⋅R1和V=I2⋅R2
这两个条件表示每个电阻两端的电压必须等于总电压 (V = 15V)。
Python求解代码
假设电路中有两个电阻 R 1 = 5 Ω R_1 = 5 \Omega R1=5Ω 和 R 2 = 10 Ω R_2 = 10 \Omega R2=10Ω,并联连接,总电压为 V = 15 V V = 15V V=15V。求解电路中各分支的电流。
from pulp import LpProblem, LpMinimize, LpVariable, lpSum, value
# 定义线性规划问题
Min_I = LpProblem("Minimize_Current", LpMinimize)
# 定义决策变量,I1 和 I2 为电流,通过每个电阻的电流
I1 = LpVariable('I1', lowBound=0) # 电阻1中的电流
I2 = LpVariable('I2', lowBound=0) # 电阻2中的电流
# 电压
V = 15
R1 = 5
R2 = 10
# 定义目标函数:最小化总电流 I = I1 + I2
Min_I += I1 + I2, "Total_Current"
# 添加约束条件:满足欧姆定律
Min_I += I1 * R1 == V, "Ohm_Law_R1"
Min_I += I2 * R2 == V, "Ohm_Law_R2"
# 求解问题
Min_I.solve()
# 输出结果
print("电阻1中的电流 I1: ", value(I1), "A")
print("电阻2中的电流 I2: ", value(I2), "A")
print("总电流 I: ", value(I1) + value(I2), "A")