【python】非线性规划求值,同样的限制条件不同的写法,一个可以计算一个不能计算

如题

题目是求目标函数最小值,附有限制条件

img

这是显示Inequality constraints incompatible的代码

import numpy as np
from scipy.optimize import minimize

def func(x):
    return np.log2(1+2*x[0]/3 + np.log2(3*x[1]/4))

cons = ({'type':'ineq', 'fun':lambda x:np.log2(1 + 2*x[0]/5) - 5},
        {'type':'ineq', 'fun':lambda x:np.log2(1 + 6*x[1]/4) - 5},
        )
x0 = np.array([0.5,0.5])
res = minimize(func,x0,constraints=cons)

print(res)

但是这样写却可以正常运行并得出结果

import numpy as np
from scipy.optimize import minimize

def fun(a,b,c,d):
    def v(x):
        return np.log2(1+x[0]*a/b)+np.log2(1+x[1]*c/d)
    return v
    
#限制条件函数
def con(a,b,i):
    def v(x):
        return np.log2(1 + x[i] * a / b)-5
    return v

# 定义常量值
args = [2, 3, 3, 4]  # a,b,c,d
args1 = [2, 5, 6, 4] 

# 设置初始猜测值
x0 = np.asarray((0.5, 0.5))

#设置限制条件
cons = ({'type': 'ineq', 'fun': con(args1[0],args1[1],0)},
        {'type': 'ineq', 'fun': con(args1[2],args1[3],1)},
        )

res = minimize(fun(args[0], args[1], args[2], args[3]), x0, constraints=cons)
print(res)

给我人整蒙了

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7686165
  • 以下回答来自chatgpt: 回答: Python中可以使用SciPy模块中的optimize模块来解决非线性规划问题。optimize模块提供了一系列的优化算法,包括非线性规划、线性规划、最小二乘等等。其中,非线性规划可以使用minimize函数来求解目标函数的最小值。 以下是一个利用optimize模块求解非线性规划问题的示例代码: ```python from scipy.optimize import minimize def objective(x): return x[0]**2 + x[1]**2 def constraint1(x): return x[0] + x[1] - 1 def constraint2(x): return x[0]**2 + x[1]**2 - 2 cons = [{'type': 'ineq', 'fun': constraint1}, {'type': 'ineq', 'fun': constraint2}] bnds = ((-10, 10), (-10, 10)) x0 = [0.5, 0.5] res = minimize(objective, x0, method='SLSQP', bounds=bnds, constraints=cons) print(res) ``` 在这个示例中,我们定义了一个目标函数 `objective`,一个等式约束条件 `constraint1` 和一个不等式约束条件 `constraint2`。约束条件的形式是 `fun(x) >= 0` 或 `fun(x) == 0`,其中 `x` 是自变量向量。我们将约束条件用字典形式定义在 `cons` 列表中,并将自变量变量的取值范围定义在 `bnds` 变量中。最后,我们使用 `minimize` 函数求解目标函数的最小值,并指定求解方法为 `SLSQP`。 至于您遇到的"Inequality constraints incompatible"错误,可能是由于约束条件不满足某些限制条件,导致求解过程无法进行或无法得到有效解。您可以检查一下约束条件的定义是否正确,或者尝试修改一下限制条件,看看是否能够得到正确的解。 希望这些信息能够帮助您解决问题!

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^