如何用SymPy从符号线性不等式直接获取矩阵-向量表示?
从SymPy符号线性不等式直接生成系数矩阵A和上界向量b
完全可以不用手动转换,借助SymPy的符号表达式处理能力,能直接从定义的符号线性不等式提取出系数矩阵A和上界向量b。以下是具体实现步骤和代码示例:
实现步骤
- 用SymPy定义符号变量和目标不等式组;
- 遍历每个不等式,将其整理为
a₁x + a₂y + a₃z ≤ b的标准形式; - 提取每个不等式中变量的系数作为矩阵
A的行,提取右侧常数作为向量b的元素; - 将提取的结果转换为NumPy数组或SymPy矩阵,满足后续计算需求。
完整代码示例
from sympy import symbols import numpy as np # 定义符号变量 x, y, z = symbols('x y z') # 定义符号形式的不等式组 inequalities = [ -x <= 5, x <= 4, -y <= 5, x + y <= 3, -z <= 10, x + y + z <= 6 ] # 初始化存储系数和上界的列表 coeff_rows = [] b_values = [] # 逐个处理不等式 for ineq in inequalities: # 分离不等式左右两侧 lhs = ineq.lhs rhs = ineq.rhs # 将不等式转换为线性表达式:lhs - rhs ≤ 0 linear_expr = lhs - rhs # 提取变量系数和常数项 coeff_dict = linear_expr.as_coefficients_dict() # 获取x、y、z的系数(无对应变量则取0) a = coeff_dict.get(x, 0) b_coeff = coeff_dict.get(y, 0) c = coeff_dict.get(z, 0) # 计算上界值(对应标准形式的右侧常数) upper_bound = -linear_expr.as_coeff_add()[0] coeff_rows.append([a, b_coeff, c]) b_values.append(upper_bound) # 转换为NumPy数组 A = np.array(coeff_rows, dtype=np.float64) b = np.array(b_values, dtype=np.float64) # 输出结果 print("系数矩阵A:\n", A) print("上界向量b:\n", b)
运行这段代码后,会输出与手动定义完全一致的A和b数组。
内容的提问来源于stack exchange,提问作者Stéphane Laurent
相关产品推荐
相关产品推荐

