我正在编写一个使用scipy优化包的可重复脚本。作为此过程的一部分,您需要创建约束函数。我想创建一个可重复的脚本,该脚本允许我基于可变数量的输入来创建正确数量的约束函数。
例如:
def constraintx1(x):
return (x2c2*(x[1]**2))+(x1c2*x[1]) + maxresponsec2
def constraintx2(x):
return (x2c3*(x[2]**2))+(x1c3*x[2]) + maxresponsec3
def constraintx3(x):
return (x2c4*(x[3]**2))+(x1c4*x[3]) + maxresponsec4
constraints = [{'type':'ineq', 'fun':constraintx1},
{'type':'ineq', 'fun':constraintx2},
{'type':'ineq', 'fun':constraintx3}]
所有x2c2,x1c2和maxresponsec2都来自先前定义为curvestable的输入表。
这些是我的一些约束函数,用于3个输入变量。但是,在另一个项目中,我可能需要对12个变量重复此操作,并且我希望创建一个循环,该循环将基于计数器生成正确数量的约束函数。我一直在环顾四周,但还没有找到任何东西。我希望有一些类似的东西:
numberofvariables = len(someinput)
constraints = []
for g in range(0,numberofvariables):
def constraintg (x):
return curvestable.iloc[g,1]*(x[0]**2))+(curvestable.iloc[g,2]*x[0]) + curvestable.iloc[g,4]
constraints = constraints.append([{'type':'ineq', 'fun':constraintg}])
next
我还需要指出,我在编码方面非常业余,因此不确定是否可行。
答案 0 :(得分:1)
您应该签出python closure
函数。
def constraint_func_maker(x2c2, x1c2, maxresp):
def constraint_func(x):
return (x2c2 * (x[1] ** 2)) + (x1c2 * x[1]) + maxresp
return constraint_func
答案 1 :(得分:0)
n = len(someinput)
ct = curvetable
constraints = [lambda x: ct.iloc[g,1]*(x[0]**2))+(ct.iloc[g,2]*x[0])+ ct.iloc[g,4] for g in range(n)]
这涉及使用两个关键的python元素:
此外,由于您的curvetable(重命名为ct,以使代码更短)是DataFrame
,因此您可以使用apply
函数,但是我不想花太多精力来分散注意力要点-lambda表达式