首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用scipy.minimize迭代约束

用scipy.minimize迭代约束
EN

Stack Overflow用户
提问于 2022-03-09 09:03:35
回答 1查看 186关注 0票数 1

我试图最小化一个带有两个变量x,x1的函数。A、B和C是尺寸为10x10的数据格式。当我不使用约束时,优化的工作原理是一样的,但是我也关心约束的情况。对于受约束的案子,我想

A.iloci,j*x*B.iloci,j*x1*C.iloci,j

要使i和j的所有组合等于或大于零。为此,我以下列方式定义了约束:

代码语言:javascript
复制
cons=[]
def f(a):
    def g(x):
        return A.iloc[i,j]*x[0]*B.iloc[i,j]*x[1]*C.iloc[i,j]
    return g

for i in range (10):
    for j in range(10):
        cons.append({'type':'ineq', 'fun': f(t)})

当我得到适当数量的约束(即len(cons) = 100)时,优化结果并不满足我所想到的约束,这意味着它导致x、x1和x2的值。

A.iloci,j*x*B.iloci,j*x1*C.iloci,j

对于许多j,i是小于零的,我已经确定result.success = True,所以突然停止的优化可以排除为一个潜在的问题。在寻找这个问题的解决方案时,我发现了一些人试图在this中迭代约束的情况,但是他们只在一个范围内迭代,而不是在两个范围上迭代,而且我无法修改他们的解决方案来处理我的情况。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-09 09:39:32

您的函数f没有任何意义,因为函数g不依赖于a。如果您真的希望f返回一个新函数,这取决于索引it,那么f应该是这两个索引的函数:

代码语言:javascript
复制
cons=[]
def f(t, i):
    def g(x):
        return A.iloc[t,i]+(x[0]*B.iloc[t,i]+x[1]*C.iloc[t,i]+x[2]*D.iloc[t,i])/33
    return g

for t in range (72):
    for i in range(33):
        cons.append({'type':'ineq', 'fun': f(t, i)})

还请注意,由于lambda表达式,您可以轻松地动态定义约束函数:

代码语言:javascript
复制
cons = []
for t in range(72):
    for i in range(33):
        cons.append({'type': 'ineq', 'fun': lambda x, t=t, i=i: A.iloc[t,i]+(x[0]*B.iloc[t,i]+x[1]*C.iloc[t,i]+x[2]*D.iloc[t,i])/33}) 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71406747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档