Calling Gekko solve gives TypeError: object of type 'int' has no len()
Calling Gekko solve gives TypeError: object of type 'int' has no len()
我正在尝试使用 Gekko 解决最优控制问题。当我尝试调用 m.solve()
时,它给了我 TypeError: object of type 'int' has no len()
,详情如下。无论我选择 objective 函数,我都会收到此错误;然而,only similar issue I've found 有一个不可微约束的问题,我很确定我的约束是可微的。我可能会在使用 Gekko 时遇到此类错误还有其他原因吗?
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-25-9f7b73717b27> in <module>
1 from gekko import GEKKO
----> 2 solve_system()
<ipython-input-24-f224d4cff3fc> in solve_system(theta, alpha, rho, chi, L_bar, n, w, delta_inc, xi, phi, tau, kappa, GAMMA, T, SIGMA, BETA, s_init, i_init, r_init)
257 ##### solve model #####
258 m.options.IMODE = 6
--> 259 m.solve()
~\Anaconda3\lib\site-packages\gekko\gekko.py in solve(self, disp, debug, GUI, **kwargs)
1955 # Build the model
1956 if self._model != 'provided': #no model was provided
-> 1957 self._build_model()
1958 if timing == True:
1959 print('build model', time.time() - t)
~\Anaconda3\lib\site-packages\gekko\gk_write_files.py in _build_model(self)
54 model += '\t%s' % variable
55 if not isinstance(variable.VALUE.value, (list,np.ndarray)):
---> 56 if not (variable.VALUE==None):
57 i = 1
58 model += ' = %s' % variable.VALUE
~\Anaconda3\lib\site-packages\gekko\gk_operators.py in __len__(self)
23 return self.name
24 def __len__(self):
---> 25 return len(self.value)
26 def __getitem__(self,key):
27 return self.value[key]
~\Anaconda3\lib\site-packages\gekko\gk_operators.py in __len__(self)
142
143 def __len__(self):
--> 144 return len(self.value)
145
146 def __getitem__(self,key):
TypeError: object of type 'int' has no len()
我确实在我的约束中调用了一个外部(但可微)函数。但是,删除它并仅在没有该功能的情况下进行工作并不能解决问题。我真的很感激你们能提供的任何意见。谢谢!
此错误可能是因为您在 Gekko 表达式中使用了 Numpy 数组或 Python 列表。
import numpy as np
x = np.array([0,1,2,3]) # numpy array
y = [2,3,4,5] # python list
from gekko import GEKKO
m = GEKKO()
m.Minimize(x) # error, use Gekko Param or Var
m.Equation(m.sum(x)==5) # error, use Gekko Param or Var
您可以通过切换到 Gekko 参数或变量来避免此错误。 Gekko 可以使用 Python 列表或 Numpy 数组进行初始化。
xg = m.Param(x)
yg = m.Var(y)
m.Minimize(xg)
m.Equation(m.sum(yg)==5)
m.solve()
我正在尝试使用 Gekko 解决最优控制问题。当我尝试调用 m.solve()
时,它给了我 TypeError: object of type 'int' has no len()
,详情如下。无论我选择 objective 函数,我都会收到此错误;然而,only similar issue I've found 有一个不可微约束的问题,我很确定我的约束是可微的。我可能会在使用 Gekko 时遇到此类错误还有其他原因吗?
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-25-9f7b73717b27> in <module>
1 from gekko import GEKKO
----> 2 solve_system()
<ipython-input-24-f224d4cff3fc> in solve_system(theta, alpha, rho, chi, L_bar, n, w, delta_inc, xi, phi, tau, kappa, GAMMA, T, SIGMA, BETA, s_init, i_init, r_init)
257 ##### solve model #####
258 m.options.IMODE = 6
--> 259 m.solve()
~\Anaconda3\lib\site-packages\gekko\gekko.py in solve(self, disp, debug, GUI, **kwargs)
1955 # Build the model
1956 if self._model != 'provided': #no model was provided
-> 1957 self._build_model()
1958 if timing == True:
1959 print('build model', time.time() - t)
~\Anaconda3\lib\site-packages\gekko\gk_write_files.py in _build_model(self)
54 model += '\t%s' % variable
55 if not isinstance(variable.VALUE.value, (list,np.ndarray)):
---> 56 if not (variable.VALUE==None):
57 i = 1
58 model += ' = %s' % variable.VALUE
~\Anaconda3\lib\site-packages\gekko\gk_operators.py in __len__(self)
23 return self.name
24 def __len__(self):
---> 25 return len(self.value)
26 def __getitem__(self,key):
27 return self.value[key]
~\Anaconda3\lib\site-packages\gekko\gk_operators.py in __len__(self)
142
143 def __len__(self):
--> 144 return len(self.value)
145
146 def __getitem__(self,key):
TypeError: object of type 'int' has no len()
我确实在我的约束中调用了一个外部(但可微)函数。但是,删除它并仅在没有该功能的情况下进行工作并不能解决问题。我真的很感激你们能提供的任何意见。谢谢!
此错误可能是因为您在 Gekko 表达式中使用了 Numpy 数组或 Python 列表。
import numpy as np
x = np.array([0,1,2,3]) # numpy array
y = [2,3,4,5] # python list
from gekko import GEKKO
m = GEKKO()
m.Minimize(x) # error, use Gekko Param or Var
m.Equation(m.sum(x)==5) # error, use Gekko Param or Var
您可以通过切换到 Gekko 参数或变量来避免此错误。 Gekko 可以使用 Python 列表或 Numpy 数组进行初始化。
xg = m.Param(x)
yg = m.Var(y)
m.Minimize(xg)
m.Equation(m.sum(yg)==5)
m.solve()