0
目前,我正在研究我的畢業設計,但我的代碼有一些麻煩。有沒有人可以幫助我解決我的錯誤。我正試圖優化用水產生的利潤。TyperError:'函數'對象沒有屬性'_getitem_'
我得到的錯誤是下面的一個(出現在如果行的約束):
TypeError: 'function' object has no attribute '__getitem__'
我的代碼:
#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)
請注意'[] * n == []'。 – Elazar
''__getitem__'由'[[]]'產生,就像索引列表,字典或數組時一樣。這個錯誤意味着一個函數正在用'fn [']'而不是'fn(...)'來調用。 – hpaulj