Actuellement, je travaille sur mon projet de fin d'études, mais j'ai quelques problèmes avec mon code. Y at-il peut-être quelqu'un qui pourrait aider à résoudre mon erreur. J'essaie d'optimiser les profits générés hors de l'eau.TyperError: l'objet 'function' n'a pas d'attribut '_getitem_'
L'erreur que je reçois est la suivante (apparaît dans la si la ligne de la contrainte):
TypeError: 'function' object has no attribute '__getitem__'
Mon code:
#constants
Ymax=8 #tonne/ha
ky=1.25
Numbas=3 #3 subbasins
Nummon=12 #12 months is a year.
c_hydro=0.9 #Conversion rate m3 to kWh
LBPmaize=316413 #LBP/tonne
LBPhydro=55 #LBP/kWh
alpha=0.7
p1=0.35 #soil moisture depletion factor for no stress
#parameters
S0=[207.112, 150, 161.398]
A=[74571.9, 1537.8, 6645.7] #total area per subbasin
a=[0.423, 0.959, 0.473] #part of area used for irrigation
R=[0.2, 0.3, 0.5]
Qhydromatrix=[0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,
1,1,1,1,1,0,0,0,0,1,1,1]
#Definitions
def profit(x,sign=-1):
x=[]*(Numbas*Nummon)
return sign * (alpha*Yasum*LBPmaize)
def ETa(x):
for i in range(0,(Nummon*Numbas)):
ETa=[]*(Numbas*Nummon)
if np.multiply(x,p1)>ETmax_maize:
ETa[i]=ETmax_maize[i]
else:
ETa[i]=np.multiply(x[i],p1)
return ETa
def Yasum(ETa):
Yasum=0
for j in range(0,Numbas):
for i in range(0,Nummon):
ETasum=sum(ETa[j*Nummon:(j+1)*Nummon])
ETmaxsum=sum(ETmax_maize[j*Nummon:(j+1)*Nummon])
Ya=((-1*Ymax*ky)*(1-(ETasum/ETmaxsum))+Ymax)*A[j]*a[j]
Yasum=Yasum+Ya
return Yasum
def constraint(x):
for j in range(0,Numbas):
for i in range(0,Nummon):
if (i-(j*Nummon))==0:
x[i+(j*Nummon)]-((1-R[j])*S0[j])+ETa[i+(j*Nummon)+11]-P[i+(j*Nummon)+11]-Rdown[i+(j*Nummon)]
else:
ETa[i+(j*Nummon)-1]-((1-R[j])*x[i+(j*Nummon)-1])+x[i+(j*Nummon)]-P[i+(j*Nummon)-1]-Rdown[i+(j*Nummon)]
return x
con2=({'type':'ineq','fun':constraint})
x0=[100]*(Nummon*Numbas)
sol=minimize(profit, x0,method='SLSQP', constraints=con2)
Notez que '[] * n == []'. – Elazar
'__getitem__' est produit par un' [...] ', comme cela est fait lors de l'indexation d'une liste, d'un dictionnaire ou d'un tableau. L'erreur signifie qu'une fonction est appelée avec fn [...] 'plutôt que fn (...)'. – hpaulj