You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 09:36:07