Ich bin irgendwie (grad) zu blöd was zu verstehen. Ich arbeite mit der Anaconda-Distribution an einer Optimierung. Die Nebenbedingungen werden dabei als Sequenz von Dictionaries übergen, also z.B. cons=({"type": "eq", "fun": lambda x: ...}, {"type": "eq", "fun": lambda x: ...}, ...)
Ich versuche nun diese Sequenz von Dictionaries (und die minimize-Funktion) mit einer for-Schleife zu generieren, indem ich eine 2D-Liste habe, wie z.B. [["min",function1,wert1],["lower boundary",werte_liste1, boundary1], ["fix", werte_liste2, fix_wert1], ...].
Die for-Schleife liest dann 2D_liste[0] aus und überprüft mit if und alle weiteren möglichen Fällen mit elif, ob es sich um "min", oder "lower boundary", o.a. handelt und fügt dann die Nebenbedingung zu meinem Anfangstupel, cons({},) mittels cons+=({neue Nebenbedingung},) hinzu.
Das Ganze funktioniert, solange nur einmal der erste Fall in meiner 2D-Liste auftritt. Sobald ich zwei Einträge mit z.B. "fix" habe, ignoriert? oder überschreibt? er den ersten Eintrag. Das verstehe ich überhaupt nicht. Füge ich eine zweite "fix2"-Bedingung zu (siehe unten), dann klappt es, so als ob innerhalb der for-Schleife die Variablen wie global sind und cons+= nicht wirklich erweitert wird.
Hier der Teil meines Codes:
Code: Alles auswählen
optimization=["min",log_g1_list]
condition1=["fix",Deps_list,-4.2]
condition2=["fix2",tcl_list,85]
condition3=["larger than",log_K11_list,math.log(20)]
condition5=["lower than",log_K33_list,math.log(13)]
condition_list=[optimization,condition1,condition2,condition3,condition5]
cons=({'type': 'eq', 'fun': lambda x: sum(x[i] for i in range(len(tcl_list)))-1},)
for condition in condition_list:
if condition[0]=="min":
min_list=condition[1]
fun=lambda x: sum(x[y]*(1.0)*min_list[y] for y in range(len(min_list)))
elif condition[0]=="max":
max_list=condition[1]
fun=lambda x: sum(x[y]*(-1.0)*max_list[y] for y in range(len(max_list)))
elif condition[0]=="fix":
fix_list=condition[1]
fix_value=condition[2]
cons+=({'type': 'eq', 'fun': lambda x: sum(x[y]*fix_list[y] for y in range(len(fix_list)))-fix_value},)
elif condition[0]=="fix2":
fix_list2=condition[1]
fix_value2=condition[2]
cons+=({'type': 'eq', 'fun': lambda x: sum(x[y]*fix_list2[y] for y in range(len(fix_list)))-fix_value2},)
elif condition[0]=="lower than":
lower_list=condition[1]
lower_value=condition[2]
cons+=({'type': 'ineq', 'fun': lambda x: sum(x[y]*(-1.0)*lower_list[y] for y in range(len(lower_list)))+lower_value},)
elif condition[0]=="larger than":
larger_list=condition[1]
larger_value=condition[2]
cons+=({'type': 'ineq', 'fun': lambda x: sum(x[y]*larger_list[y] for y in range(len(larger_list)))-larger_value},)
Tuvok