线性规划------ + 案例 + Python源码求解(见文中)

news2024/9/21 8:43:14

目录

  • 一、代数模型(Algebraic Models)详解
    • 1.1什么是代数模型?
    • 1.2代数模型的基本形式
    • 1.3 安装所需要的Python包--运行下述案例
    • 1.4代数模型的应用案例
      • 案例 1:市场供需平衡模型
        • Python求解代码
        • Python求解结果如下图:
      • 案例 2:运输问题中的线性规划模型
        • 进行数学建模分析
          • 1. 目标函数
          • 2. 约束条件
        • Python求解代码
        • Python求解结果如下图:
      • 案例 3:电路分析中的欧姆定律应用
        • 进行数学建模分析
          • 1. 目标函数
          • 2. 约束条件
        • Python求解代码
        • Python求解结果如下图:

一、代数模型(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=cdddP

其中, 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
供应地146
供应地287

供应量和需求量分别为:

  • 供应地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. 供应地1的总供应量不超过50单位:

0 < x 1 + x 2 < = 50 0 < x_1 + x_2 <= 50 0<x1+x2<=50

  1. 供应地2的总供应量不超过60单位:

0 < x 3 + x 4 < = 60 0 < x_3 + x_4 <= 60 0<x3+x4<=60

  1. 需求地1的总需求量必须是30单位:

x 1 + x 3 = 30 x_1 + x_3 = 30 x1+x3=30

  1. 需求地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=I1R1V=I2R2
这两个条件表示每个电阻两端的电压必须等于总电压 (V = 15V)。

Python求解代码

假设电路中有两个电阻 R 1 = 5 Ω R_1 = 5 \Omega R1= 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")

Python求解结果如下图:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2144548.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android绘制靶面,初步点击位置区域划分取值测试

自定义View&#xff1a; public class TargetView extends View {private Paint paint;private int[] radii {100, 250, 400, 550, 700}; // 五个圆的半径private int numberOfSegments 8;private int[][] regionValues; // 存储每个区域的值public TargetView(Context cont…

单例模式(饿汉式-懒汉式)

我给面试官讲解了单例模式后&#xff0c;他对我竖起了大拇指&#xff01;https://blog.csdn.net/weixin_41949328/article/details/107296517?ops_request_misc%257B%2522request%255Fid%2522%253A%2522FAEE9ABD-432D-416C-98C6-9DD939138DEB%2522%252C%2522scm%2522%253A%252…

检查和测绘室内防撞无人机技术详解

随着无人机技术的飞速发展&#xff0c;其应用领域已从传统的航拍、农业扩展到更为精细化的室内空间测绘、巡检、物流等领域。在室内环境中&#xff0c;无人机面临着空间狭小、障碍物多、GPS信号弱等挑战&#xff0c;因此对防撞技术提出了更高的要求。室内防撞无人机技术的研发&…

JMeter 中使用 Gson 操作请求中的Boby参数

背景 使用org.json.JSONObject 转换&#xff0c;与原Body参数顺序发生变化&#xff0c;原因&#xff1a;JSONObject内部是用Hashmap来存储的&#xff0c;本质上是一个无序的键值对集合&#xff0c;不应依赖字段的添加顺序。 为解决org.json.JSONObject 输出顺序问题&#xff…

【virtuoso】AMS数模混合仿真

一、新建Verilog文件 1.1 新建functional 文件 1.2 编写Verilog文件 module phv (ckv ,rst_n ,phv_n );input ckv ;input rst_n ;output reg [10:0] phv_n;always (posedge ckv) beginif(rst_n)phv_n < 11b0;elsephv_n <…

PCIe扫盲(六)

系列文章目录 PCIe扫盲&#xff08;一&#xff09; PCIe扫盲&#xff08;二&#xff09; PCIe扫盲&#xff08;三&#xff09; PCIe扫盲&#xff08;四&#xff09; PCIe扫盲&#xff08;五&#xff09; PCIe扫盲&#xff08;六&#xff09; 文章目录 系列文章目录Flow Control…

io多路复用:epoll水平触发(LT)和边沿触发(ET)的区别和优缺点

在进行ET模式的正式分析之前&#xff0c;我们来举个例子简单地了解下ET和LT: 假设我们通过fork函数创建了父子两个进程&#xff0c;并通过匿名管道来通信&#xff0c;在子进程中&#xff0c;我们一次向管道写入10个字符数据&#xff0c;为"aaaa\nbbbb\n";每隔5s写入…

深入解析JSP会话跟踪:从原理到实践

什么是会话? 生活中:一次电话.一次取款过程Web应用一次会话:一个客户端浏览器与web服务器之间连续发生的一系列请求和相应的过程 什么是会话状态&#xff1f; 会话状态是指Web服务器与浏览器在会话过程中产生的状态信息。 什么是Cookie&#xff1f; 引言&#xff1a;浏览购…

windows使用tcpdump.exe工具进行抓包教程

windows主机安装一些抓包工具可能有些不方便&#xff0c;这里有一个tcpdump.exe工具直接免安装&#xff0c;可以直接使用进行抓包。&#xff08;工具下载见 附件&#xff09; tcpdump.exe使用教程 如下&#xff1a; 1&#xff1a;tcpdump -D 可查看网络适配器(注意前面的编号)…

htaccess转换nginx工具

115工具网为您提供htaccess与nginx在线转换,apache伪静态文件转为nginx重写规则,htaccess伪静态规则换nginx,apache RewriteRule转rewrite,apache伪静态文件转nginx重写,apache转nginx重写规则&#xff0c;本工具支持所有的htaccess伪静态、基本的配置规则、重定向等转换为ngin…

java多线程编程示例

程序功能 程序展示了 Java 中如何使用多线程来并行执行任务。具体功能如下&#xff1a; 程序创建了三个线程&#xff0c;每个线程执行相同的任务类 Task。 每个线程在运行时输出自身名称&#xff0c;并模拟执行五次任务&#xff0c;每次任务间隔 1 秒。 主线程在启动这三个线程…

技术周总结 09.09~09.15周日(C# WinForm WPF 软件架构)

文章目录 一、09.09 周一1.1) 问题01: Windows桌面开发中&#xff0c;WPF和WinForm的区别和联系&#xff1f;联系&#xff1a;区别&#xff1a; 二、09.12 周四2.1&#xff09;问题01&#xff1a;visual studio的相关快捷键有哪些&#xff1f;通用快捷键编辑导航调试窗口管理 2…

C++:日期类的实现

目录 一、前言 二、头文件 三、各个函数的实现 打印、检查日期及获取日期 、、-、-、 、<、<、>、>、 &#xff01; 日期-日期 >>、<< 一、前言 前面几篇讲了关于类和对象的一些知识&#xff0c;本篇就来实现一下前面用到的日期类。 二、头文…

Java 中 List 常用类和数据结构详解及案例示范

1. 引言 在 Java 开发中&#xff0c;List 是最常用的数据结构接口之一&#xff0c;它用于存储有序的元素集合&#xff0c;并允许通过索引进行随机访问。电商系统中&#xff0c;如购物车、订单列表和商品目录等功能都依赖 List 进行数据管理。选择适当的 List 实现类能够显著提…

三菱变频器变更电流最大输入(20mA 初始值)时的频率(60Hz初始值)

变更最高频率。变更示例 在4~ 20mA 输入频率设定器中&#xff0c;将 20mA 时的频率从 60Hz(初始值)变更为 50Hz。 输入 20mA 电流时调整为输出 50Hz。 将Pr.126 设定为“50Hz” NOTE 4mV 时的频率设定可通过校正参数 C5 设定。 其他的频率设定电流增益的调整方法&#xff0c;还…

计算机网络(七) —— https协议与网络安全证书

目录 一&#xff0c;关于https 二&#xff0c;关于加密 2.1 明文&#xff0c;密钥 2.2 对称和非对称加密 2.3 数据摘要&#xff0c;数据指纹&#xff0c;数字签名 三&#xff0c;https过程过程探究 四&#xff0c;证书 4.1 CA认证 4.2 证书大致内容和申请流程 4.3 签…

试用完几十款ETL工具后的经验总结,ETL工具用这三款就足够了

1.ETL选型前言 市面上ETL工具国内外加起来估计得有30种之多&#xff0c;其中近20款工具都花时间试用过&#xff0c;现在把试用后总结出来的经验分享一下&#xff0c;目前很多企业在选择ETL工具时不知道怎么选择适合自己的工具也不可能一款一款的去试用&#xff0c;试用成本非常…

3.postman脚本语言、接口关联(json引用(变量)、脚本用正则表达式)、断言封装、自动化构造接口请求(Postman工具)

一、Postman的脚本语言 1.使用js语言 2.pm变量 pm.sendRequest():发送HTTP请求 二、自动化实现接口关联 1.JSON引用 2.正则表达式&#xff08;在test下编写如下脚本&#xff09; //获取响应 console.log(responseBody) //re的方式获取token let token responseBody.match(&quo…

佰朔资本:股票中什么叫龙头?怎么找龙头股?

龙头&#xff0c;也便是龙头股&#xff0c;指的是某一工作中有必定影响力和号召力的股票&#xff0c;龙头股的涨跌一般对其他同工作板块股票的涨跌有必定演示和引导效果&#xff0c;是一种风向标一般的存在。龙头股的技能面表现和成交量都会比一同间的大盘和地块要强。 龙头股…

三菱变频器以模拟量电流进行频率设定(电流输入)

POINT 1、在 STF(STR)信号 ON 时&#xff0c;发出启动指令。2、请将 AU 信号置为 ON。 3、请设定 Pr.79 运行模式选择 “2”(外部运行模式)。 接线示例 重点&#xff1a;请将 AU 信号置为 ON。 操作示例&#xff1a;以 60Hz 运行。 1、接通电源时的画面&#xff0c;监视器显…