python非线性规划

解决较为复杂的非线性规划时,出现了Optimization problem (res1): Inequality constraints incompatible的错误

from scipy.optimize import minimize
import numpy as np


def fun():  # 定义目标函数
    v = lambda x: x[0] * x[1] + x[2] * x[3] + x[4] * x[5]
    return v


def constraint(args):  # 定义约束条件函数
    a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, l, h, q = args
    cons = ({'type': 'eq', 'fun': lambda x: x[0] + x[3] + x[5] - a5},   # 等式约束
            {'type': 'ineq', 'fun': lambda x: x[0] - a6 * x[1]},
            {'type': 'ineq', 'fun': lambda x: x[2] - a7 * x[3]},
            {'type': 'ineq', 'fun': lambda x: x[2] - a8},
            {'type': 'ineq', 'fun': lambda x: x[4] - a9 * x[5]},
            {'type': 'ineq', 'fun': lambda x: (a4*a3*(x[3]+a1*x[0]+a1*(x[4]*x[5]*(x[5]+x[0])-x[2]*x[3]*(x[3]+x[0]))/(x[2]*x[3]+x[4]*x[5]+x[0]*x[1])))/(a2*(x[2]*(x[3]**3)+x[4]*(x[5]**3)+x[1]*(x[0]**3))+x[2]*x[3]*((a1*(x[3]+x[0])+a1*(x[4]*x[5]*(x[5]+x[0])-x[2]*x[3]*(x[3]+x[0]))/(x[2]*x[3]+x[4]*x[5]+x[0]*x[1]))**2)+x[4]*x[5]*((a1*(x[5]+x[0])-a1*(x[4]*x[5]*(x[5]+x[0])-x[2]*x[3]*(x[3]+x[0]))/(x[2]*x[3]+x[4]*x[5]+x[0]*x[1]))**2)+x[0]*x[1]*(a1*(x[4]*x[5]*(x[5]+x[0])-x[2]*x[3]*(x[3]+x[0]))/(x[2]*x[3]+x[4]*x[5]+x[0]*x[1]))**2)-a10},
            {'type': 'ineq', 'fun': lambda x: (a4*a3*(x[5]+a1*x[0]-a1*(x[4]*x[5]*(x[5]+x[0])-x[2]*x[3]*(x[3]+x[0]))/(x[2]*x[3]+x[4]*x[5]+x[0]*x[1])))/(a2*(x[2]*(x[3]**3)+x[4]*(x[5]**3)+x[1]*(x[0]**3))+x[2]*x[3]*((a1*(x[3]+x[0])+a1*(x[4]*x[5]*(x[5]+x[0])-x[2]*x[3]*(x[3]+x[0]))/(x[2]*x[3]+x[4]*x[5]+x[0]*x[1]))**2)+x[4]*x[5]*((a1*(x[5]+x[0])-a1*(x[4]*x[5]*(x[5]+x[0])-x[2]*x[3]*(x[3]+x[0]))/(x[2]*x[3]+x[4]*x[5]+x[0]*x[1]))**2)+x[0]*x[1]*(a1*(x[4]*x[5]*(x[5]+x[0])-x[2]*x[3]*(x[3]+x[0]))/(x[2]*x[3]+x[4]*x[5]+x[0]*x[1]))**2)-a10})
    return cons


# 输入约束条件参数和常数
l1 = float(input("请输入跨径l(单位是m):"))
print("l = ", l1)
#    梁高h单位为mm
h1 = float((l1/20) * (10**3))
#    均匀荷载q = 10 kN*m
q1 = float(10)
# 变量x[0]----hw 腹板计算高度
#    x[1]----tw 腹板厚度
#    x[2]----b1 上翼缘宽度
#    x[3]----t1 上翼缘厚度
#    x[4]----b2 下翼缘宽度
#    x[5]----t2 下翼缘厚度
#    均匀荷载q = 10 kN*m



# 定义边界约束
b = (0.0, None)
bnds = (b, b, b, b, b, b)
# 定义约束条件
args2 = (0.5, 1/12, 1125.0, 0.000001, 1500.0, 60.0, 24.0, 400.0, 32.0, 80.0, l1, h1, q1)  # a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, l, h, q  # 定义约束条件中的参数
cons = constraint(args2)

# 求解优化问题
x0 = np.asarray((0.5, 0.5, 0.5, 0.5, 0.5, 0.5))  # 定义搜索的初值
res = minimize(fun(), x0, method='SLSQP', constraints=cons)

print("Optimization problem (res1):\t{}".format(res.message))  # 优化是否成功
print("xOpt = {}".format(res.x))  # 自变量的优化值
print("min f(x) = {:.4f}".format(res.fun))  # 目标函数的优化值

想求解的问题是这个

img

但是求解后的状态如下

img

通常是由于约束条件无解。
也就是说,你要检查一下,你给出的约束条件,能否找到满足条件的解。

方案来自 梦想橡皮擦 狂飙组基于 GPT 编写的 “程秘”


"Optimization problem (res1): Inequality constraints incompatible" 这个错误通常表示您的非线性规划问题存在不兼容的不等式约束。

这个错误的原因可能是您的不等式约束之间存在矛盾或冲突,或者可能是由于您设置的变量范围或约束不正确导致的。

解决这个问题需要仔细检查您的约束和变量范围,并确保它们之间没有矛盾或冲突。可以使用不同的优化工具进行测试和调试,或者使用不同的求解器或优化算法,看看是否可以解决这个问题。

另外,也建议您检查一下非线性规划的定义是否正确,是否有可能存在其他问题导致求解不稳定或无解。

以下答案基于ChatGPT与GISer Liu编写:

该错误的出现一般有以下原因之一:

  1. 您的约束函数可能有重复约束,这会使问题不可解。
  2. 您的约束函数可能与问题的定义不兼容。 这可能是由于浮点数精度问题导致的,这使得优化器无法找到一个可行解。
  3. 也可能是因为定义的初始解不满足约束条件。

您可以尝试以下方法来排除该错误:

  1. 检查约束函数是否存在重复约束,或者是否存在不一致的约束,例如不等式约束与等式约束冲突。
  2. 检查您的约束条件是否被正确地定义。 您可以尝试重新定义约束条件并将其调整为问题的定义。
  3. 检查初始解是否满足所有约束条件,如果不满足,则尝试重新定义初始解。

根据网上查询信息,出现这个错误的可能原因有以下几种:
1、您的初始值不满足所有的不等式约束条件,导致优化算法无法找到可行解。
2、您的不等式约束条件之间存在冲突或矛盾,导致优化算法无法找到可行解。
3、您的不等式约束条件过于复杂或非线性,导致优化算法无法正确处理。


题主可以尝试以下几种方法来解决这个问题:
1、调整您的初始值或约束条件,使其更接近可行域。
2、检查您的约束条件是否有逻辑错误或数值误差。
3、使用其他优化算法或工具,如CVXOPT或IPOPT等。

这个错误通常是由于不等式约束条件不兼容导致的,您可以尝试检查不等式约束条件是否正确,以及是否存在冲突的约束条件。此外,您还可以尝试改变优化算法的参数,以改善优化结果。Optimization problem (res1): Inequality constraints incompatible的错误代表的是该非线性规划中存在不兼容的不等式约束问题。在此情况下,可以尝试分析现有的不等式约束,尝试调整相关参数,让条件约束满足兼容性要求,或者增加约束条件,使得问题能够收敛到可求解的解空间内。