专栏
标签
8月17日解答
主题活动
发布于 2025-08-20 19:28:47
查看 2过去312天

using LinearAlgebra # 线性代数包
using JuMP, GLPK # 线性规划包

================== 第一部分:线性方程组求解 ==================

function solve_linear_system()
println("\n====== 线性方程组求解 ======")
# 定义系数矩阵和常数向量
A = [
1 2 3
-1 3 7
9 0 3
]
b = [1, 4, 7]

println("方程组:")
println("x₁ + 2x₂ + 3x₃ = 1")
println("-x₁ + 3x₂ + 7x₃ = 4")
println("9x₁ + 3x₃ = 7")

# 方法1: 直接求解法
println("\n方法1: 直接矩阵求解")
x_direct = A \ b
println("解: x₁ = ", round(x_direct[1], digits=4), 
        ", x₂ = ", round(x_direct[2], digits=4),
        ", x₃ = ", round(x_direct[3], digits=4))

# 方法2: LU分解法
println("\n方法2: LU分解")
F = lu(A)
x_lu = F \ b
println("解: x₁ = ", round(x_lu[1], digits=4), 
        ", x₂ = ", round(x_lu[2], digits=4),
        ", x₃ = ", round(x_lu[3], digits=4))

# 验证解的正确性
println("\n验证解:")
residuals = A * x_direct - b
println("残差: ", round.(residuals, digits=8))
println("总残差平方和: ", round(sum(residuals.^2), digits=10))

end

================== 第二部分:线性规划问题求解 ==================

function solve_linear_programming()
println("\n\n====== 产品生产优化问题 ======")
println("约束条件:")
println(" 3x + 2y ≤ 1000")
println(" x ≥ 0")
println(" y ≥ 0")
println("目标函数: 最大化利润 P = 40x + 30y")

# 创建优化模型
model = Model(GLPK.Optimizer)

# 定义决策变量
@variable(model, x >= 0)  # 产品A数量
@variable(model, y >= 0)  # 产品B数量

# 添加约束
@constraint(model, 3x + 2y <= 1000)  # 原料限制

# 定义目标函数
@objective(model, Max, 40x + 30y)  # 最大化利润

# 求解模型
optimize!(model)

# 打印结果
println("\n求解结果:")
println("状态: ", termination_status(model))
if termination_status(model) == MOI.OPTIMAL
    x_opt = value(x)
    y_opt = value(y)
    profit = objective_value(model)
    
    println("最优生产方案:")
    println("  产品A数量 (x) = ", round(x_opt, digits=4))
    println("  产品B数量 (y) = ", round(y_opt, digits=4))
    println("  最大利润 = ", round(profit, digits=4), " 元")
    
    # 分析可行域
    println("\n可行域分析:")
    println("  x ∈ [0, ", min(1000/3, 333.3333), "]")
    println("  y ∈ [0, ", 500, "]")
    
    # 利润线斜率
    slope = -(40/30)
    println("  利润线斜率: ", round(slope, digits=4))
    
    # 计算约束边界交点
    intercept_x = 1000 / 3  # x截距
    intercept_y = 500       # y截距
    
    # 角点分析
    corners = [(0, 0), (intercept_x, 0), (0, intercept_y), (x_opt, y_opt)]
    corner_profits = [40*c[1] + 30*c[2] for c in corners]
    
    println("\n角点利润比较:")
    println("  (0,0): 利润 = 0")
    println("  (333.333,0): 利润 = ", 40*intercept_x)
    println("  (0,500): 利润 = ", 30*intercept_y)
    println("  (", x_opt, ",", y_opt, "): 利润 = ", profit)
else
    println("未找到最优解!")
end

end

================== 主程序 ==================

function main()
# 第一题:线性方程组求解
solve_linear_system()

# 第二题:线性规划问题求解
solve_linear_programming()

end

运行程序

main()

所属专栏:Syslab基础平台
产品信息:Sysplorer系统建模仿真环境
全国大学生数学建模竞赛

全部回答

暂无数据
暂无数据
用户
和原帖交流更多问题细节吧,去
我要发帖 我要发帖
资料中心 资料中心
查看更多>
热门帖子 热门帖子
主要贡献者 主要贡献者
过去7天