使用 for 循环创建多个函数
Creating multiple functions using a for loop
我正在尝试创建多个约束函数来提供 scipy.minimize。
最小化函数为:
res1 = minimize(f, x0, args, method='SLSQP', bounds=bnds, constraints=cons, options={'disp': True})
我已将缺点设置为:
cons = [con1, con2, con3, con4]
con1 = {'type': 'eq', 'fun': constraint1}
con2 = {'type': 'eq', 'fun': constraint2}
con3 = {'type': 'eq', 'fun': constraint3}
con4 = {'type': 'eq', 'fun': constraint4}
def constraint1(x):
return x[0] + x[1] + x[2] + x[3] + x[4] + x[5] + x[6] + x[7] + x[8] - 4321
def constraint2(x):
return x[9] + x[10] + x[11] + x[12] + x[13] + x[14] + x[15] + x[16] + x[17] - 123
def constraint3(x):
return x[18] + x[19] + x[20] + x[21] + x[22] + x[23] + x[24] + x[25] + x[26] - 1234
def constraint4(x):
return x[27] + x[28] + x[29] + x[30] + x[31] + x[32] + x[33] + x[34] + x[35] - 432
如何使用 for 循环自动执行此过程?问题是创建参数名称为
的函数
你根本不需要给函数 names:
def make_constraint(i,j,c):
def constraint(x):
return sum(x[i:j])+c
cons=[dict(type='eq',fun=make_constraint(i*9,(i+1)*9,c))
for i,c in enumerate([-4321,-123,-1234,-432])]
这种方法通常 运行 不如 hand-written 函数快,因为必须在每次调用时检索像 i
和 j
这样的值;如果这很重要,可以使用 ast
模块实际创建新的 Python 函数,而无需 exec
(及其相关的结构和安全)。
我正在尝试创建多个约束函数来提供 scipy.minimize。
最小化函数为:
res1 = minimize(f, x0, args, method='SLSQP', bounds=bnds, constraints=cons, options={'disp': True})
我已将缺点设置为:
cons = [con1, con2, con3, con4]
con1 = {'type': 'eq', 'fun': constraint1}
con2 = {'type': 'eq', 'fun': constraint2}
con3 = {'type': 'eq', 'fun': constraint3}
con4 = {'type': 'eq', 'fun': constraint4}
def constraint1(x):
return x[0] + x[1] + x[2] + x[3] + x[4] + x[5] + x[6] + x[7] + x[8] - 4321
def constraint2(x):
return x[9] + x[10] + x[11] + x[12] + x[13] + x[14] + x[15] + x[16] + x[17] - 123
def constraint3(x):
return x[18] + x[19] + x[20] + x[21] + x[22] + x[23] + x[24] + x[25] + x[26] - 1234
def constraint4(x):
return x[27] + x[28] + x[29] + x[30] + x[31] + x[32] + x[33] + x[34] + x[35] - 432
如何使用 for 循环自动执行此过程?问题是创建参数名称为
的函数你根本不需要给函数 names:
def make_constraint(i,j,c):
def constraint(x):
return sum(x[i:j])+c
cons=[dict(type='eq',fun=make_constraint(i*9,(i+1)*9,c))
for i,c in enumerate([-4321,-123,-1234,-432])]
这种方法通常 运行 不如 hand-written 函数快,因为必须在每次调用时检索像 i
和 j
这样的值;如果这很重要,可以使用 ast
模块实际创建新的 Python 函数,而无需 exec
(及其相关的结构和安全)。