You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Python求解带0<x<1约束的非方阵Ax=b问题

非方阵Ax=b带0<x<1约束的Python求解方案

你的Sympy求解结果已经给出了解的结构:x1=0,x2、x3是自由变量x4、x5的线性表达式,x4、x5可自由取值。要添加0<x<1的约束,本质是找到满足所有线性不等式的x4、x5取值,以下是两种可行方案:

方法1:用SciPy线性规划找可行解

利用scipy.optimize.linprog模块,将约束转化为线性不等式组,求解满足所有条件的可行解(无需优化特定目标,仅找可行域内的点)。

import numpy as np
from scipy.optimize import linprog

# 目标函数系数(仅找可行解,设为全0)
c = [0, 0]

# 构造不等式约束(转换为linprog要求的A_ub @ x ≤ b_ub形式)
A_ub = [
    [-1.66644368166375, 2.70780339743064],  # -x2 ≤ 0 → x2 > 0
    [1.66644368166375, -2.70780339743064],   # x2 ≤ 1
    [-3.99892914904867, 6.49785771642014],  # -x3 ≤ 0 → x3 > 0
    [3.99892914904867, -6.49785771642014],   # x3 ≤ 1
    [-1, 0],  # -x4 ≤ 0 → x4 > 0
    [1, 0],   # x4 ≤ 1
    [0, -1],  # -x5 ≤ 0 → x5 > 0
    [0, 1]    # x5 ≤ 1
]

b_ub = [0, 1, 0, 1, 0, 1, 0, 1]

# 变量边界(与约束重复,可作为双重保障)
bounds = [(0, 1), (0, 1)]

# 求解线性规划
result = linprog(c, A_ub=A_ub, b_ub=b_ub, bounds=bounds, method='highs')

if result.success:
    x4_opt, x5_opt = result.x
    # 计算其他变量
    x1_opt = 0
    x2_opt = 1.66644368166375 * x4_opt - 2.70780339743064 * x5_opt
    x3_opt = 3.99892914904867 * x4_opt - 6.49785771642014 * x5_opt
    print("满足约束的解:")
    print(f"x1={x1_opt:.6f}, x2={x2_opt:.6f}, x3={x3_opt:.6f}, x4={x4_opt:.6f}, x5={x5_opt:.6f}")
else:
    print("未找到满足所有约束的解")

方法2:随机采样找可行解

如果只需找到一个可行解,可对自由变量x4、x5在(0,1)范围内随机采样,检查是否满足所有约束条件。

import numpy as np

# 约束检查函数
def is_feasible(x4, x5):
    x2 = 1.66644368166375 * x4 - 2.70780339743064 * x5
    x3 = 3.99892914904867 * x4 - 6.49785771642014 * x5
    return (0 < x2 < 1) and (0 < x3 < 1) and (0 < x4 < 1) and (0 < x5 < 1)

# 随机采样查找
np.random.seed(42)
found = False
for _ in range(10000):
    x4 = np.random.uniform(0, 1)
    x5 = np.random.uniform(0, 1)
    if is_feasible(x4, x5):
        x1 = 0
        x2 = 1.66644368166375 * x4 - 2.70780339743064 * x5
        x3 = 3.99892914904867 * x4 - 6.49785771642014 * x5
        print("找到可行解:")
        print(f"x1={x1:.6f}, x2={x2:.6f}, x3={x3:.6f}, x4={x4:.6f}, x5={x5:.6f}")
        found = True
        break
if not found:
    print("采样10000次未找到可行解,可能不存在满足约束的解")

关键注意点

  • 你的Sympy解中x1=0,不满足0<x1<1的严格大于约束,若约束为0≤x≤1则可忽略此问题;否则需检查原方程组是否正确,或是否存在其他解分支。
  • 若两种方法均返回无解,说明原问题的约束与方程组无交集,需重新审视问题设定。

内容的提问来源于stack exchange,提问作者Deviant

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 01:28:11