如何将Gekko对象插入或追加到现有列表/数组并解决相关报错
Gekko调用append报错问题解决
报错
AttributeError: 'GEKKO' object has no attribute 'append'的核心原因是你错误调用了GEKKO实例对象m的append方法,m作为GEKKO建模对象本身没有内置append方法,你混淆了Python原生列表/NumPy数组的拼接方法和Gekko的对象使用逻辑。
除此之外你的代码还有两处逻辑问题:
- 循环内错误执行
x = [x],会把原本的变量列表整体套进新列表,第二次循环访问x[ind]会直接触发索引报错 - 你要拼接存储多组变量值不需要在建模阶段用Gekko方法实现,Gekko变量求解后可以通过
.value[0]属性提取数值,再做数组拼接即可
修正后的可运行代码如下:
import numpy as np from gekko import GEKKO m = GEKKO(remote=True) list1 = [2, 4, 6, 8, 10] velocity = 10 beta = 0.7850 yaw_init = 0 rotor_rad = 64 rho = 1.2253 axi = 0.230742 # 原代码缺失axial_max定义,这里补充合理默认值,可根据实际需求修改 axial_max = 0.5 rot_surf_area = np.pi * (rotor_rad)**2 c_pow_free = 4 * axi * (m.cos((beta * yaw_init * np.pi)/180) - axi)**2 p_max = 0.5 * rho * rot_surf_area * c_pow_free * velocity**3 # 初始化变量 x = [m.Var(value = 5.02525317e-03, lb = 0.01, ub = axial_max) for i in range(len(list1))] # 原生列表存储对应变量映射关系,不需要调用Gekko方法 result_arr = [] powers = list() for ind, i in enumerate(list1): m.Equation(x[ind] - axial_max <= 0) cp = 4 * x[ind] * (m.cos((beta * yaw_init * np.pi)/180) - x[ind])**2 ct = 4 * x[ind] * (m.cos((beta * yaw_init * np.pi)/180) - x[ind]) power = 0.5 * rho * rot_surf_area * cp * velocity**3 powers.append(power) m.Equation((0.5 * rho * rot_surf_area * cp * velocity**3) - p_max <= 0) # 直接存储当前迭代的对应字段,求解后再提取数值 result_arr.append([yaw_init, i, ct, x[ind], power]) y = sum(powers) m.Maximize(y) # 最大化目标 m.options.IMODE = 3 # 稳态优化 m.options.SOLVER = 3 m.solver_options = ['linear_solver mumps','mu_strategy adaptive','max_iter 10000', 'tol 1.0e-5' ] m.solve() # 求解完成后统一提取数值并拼接数组 output = [] for item in result_arr: cur_row = [item[0], item[1], item[2].value[0], item[3].value[0], item[4].value[0]] output.append(cur_row) output = np.array(output) x_val = np.array([xi.value[0] for xi in x]) print("求解得到的x值:", x_val) print("最优目标值:", m.options.objfcnval) print("拼接后的完整结果数组:\n", output)
关键改动说明:
- 移除所有
m.append调用,改用Python原生列表存储变量关联关系,彻底避免GEKKO对象属性报错 - 删除循环内错误的变量重赋值逻辑,避免索引异常
- 建模阶段仅维护变量映射,求解完成后通过Gekko变量内置的
.value[0]属性提取实际数值,再转成NumPy数组即可满足你的数据追加需求
内容的提问来源于stack exchange,提问作者Fonnie
相关产品推荐
相关产品推荐

