#全国大学生数学建模竞赛 #MWORKS体验官 打卡第三天
主题活动
发布于 2025-08-18 23:19:29
查看 3过去314天
题目

思路
第一题
法一,使用LU分解。LU分解是将一个矩阵A分解为一个下三角矩阵L和一个上三角矩阵U的乘积。在Python中,可以使用Scipy库中的scipy.linalg.lu函数来进行LU分解。只需将X的系数和常数项传入函数即可求解行列式。见后面代码
法二,使用矩阵求逆。行列式矩阵求逆后,等号左边只剩X,后面即为X的对应解。见后面代码
第二题
在约束条件下的线性规划问题。首先将约束条件用算式表达出来,设x为每天生产的产品A的单位数,y为每天生产的产品B的单位数。总重量不超过1000,即3x+2y<=1000,且数量应该大于等于0,即x>=0,y>=0。利润最大,即40x+30y最大。我使用的是scipy.optimize库里面的linprog函数,该函数是求最小值,所以需要先对利润加负号。见后面代码
结果
第一题
法一(LU分解):x1 = 0.33, x2 = -1.67, x3 = 1.33
法二(矩阵求逆):x1 = 0.33, x2 = -1.67, x3 = 1.33
第二题
最优解:x = 0, y = 500
最大利润:15000 元

import numpy as np
# 第一题
A=np.array([
[1,2,3],
[-1,3,7],
[9,0,3]
])
b=np.array([1,4,7])
# 法一(LU分解)
x1=np.linalg.solve(A,b)
print(f"法一(LU分解):x1 = {x1[0]:.2f}, x2 = {x1[1]:.2f}, x3 = {x1[2]:.2f}")
# 法二(矩阵求逆)
A_inv=np.linalg.inv(A)
x2=A_inv @ b
print(f"法二(矩阵求逆):x1 = {x2[0]:.2f}, x2 = {x2[1]:.2f}, x3 = {x2[2]:.2f}")
# 第二题
# 3x+2y<=1000,x>=0,y>=0
# 求40x+30y最大值,以及此时的x和y
from scipy.optimize import linprog
# 函数的系数
c=[-40,-30]
# 定义约束条件
# 3x+2y<=1000
A_ub = [[3,2]]
b_ub = [1000]
# x>=0,y>=0
bounds = [(0,None),(0,None)]
# 线性规划求解
result = linprog(c,A_ub=A_ub,b_ub=b_ub,bounds=bounds,method='highs')
if result.success:
x = result.x[0]
y = result.x[1]
max_benefit = -result.fun
print(f"第二题最优解:x = {x:.0f}, y = {y:.0f}")
print(f"最大利润:{max_benefit:.0f} 元")
所属专栏:其他
产品信息:Syslab Online