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

GEKKO数组变量与中间变量建模报错排查及APM文件位置咨询

GEKKO参数拟合报错排查与APM文件位置问题

问题描述

尝试使用GEKKO进行拟合与函数参数估计,因待拟合参数数量可变,采用了数组形式的变量和中间变量,建模时出现错误,报错信息如下:

apm some_ip_here_gk_model14 <br><pre> ----------------------------------------------------------------
 APMonitor, Version 1.0.1
 APMonitor Optimization Suite
 ----------------------------------------------------------------


 --------- APM Model Size ------------
 Each time step contains
   Objects      :            0
   Constants    :            2
   Variables    :           15
   Intermediates:           22
   Connections  :            0
   Equations    :           24
   Residuals    :            2

 @error: Model Expression
 *** Error in syntax of function string: Invalid element: none

Position: 1                   
 none
 ?

同时在Jupyter Notebook所在文件夹未找到APM文件,需排查报错原因并确定APM文件位置。

相关代码:

import numpy as np
from gekko import GEKKO
import math

M = 10; m = 1; gj =1; n = 1
num_pulses_in_window = 4
сonstant = 1; ac = 1
el_init_guess = [1,2,3,4]
borders_left = [1,2,3,4]
borders_right = [1,2,3,4]
A1_c = (M/(M+m))*сonstant
gj_c = gj

# using GEKKO for preliminary estomation
xData = np.array([1,2,3,4])
yData = np.array([2.5,1.2,3.2,1.1])

model = GEKKO()

# parameters
x = model.Param(value = xData) 
z = model.Param(value = yData) 

# constants
A1 =  model.Const(A1_c)
gj = model.Const(gj_c)

# variables
E = model.Array(model.Var, num_pulses_in_window)
G1 = model.Array(model.Var, num_pulses_in_window)
G2 = model.Array(model.Var, num_pulses_in_window)
Gg = model.Array(model.Var, num_pulses_in_window)

#Intermediates
k_alfa = model.Intermediate(A1*model.sqrt(x))
ro = model.Intermediate(k_alfa*ac)
phi = model.Intermediate(ro)

G = model.Array(model.Intermediate, num_pulses_in_window, equation=None)
d = model.Array(model.Intermediate, num_pulses_in_window, equation=None)
f = model.Array(model.Intermediate, num_pulses_in_window, equation=None)

for i in range(0, num_pulses_in_window):
    E[i].value = el_init_guess[i]
    E[i].lower = borders_left[i]
    E[i].upper = borders_right[i]
    
    #G1
    G1[i].lower = 0.0000001
    G1[i].upper = 1
    #G2
    G2[i].lower = 0
    G2[i].upper = 0
    #Gg
    Gg[i].lower = 0.0000001
    Gg[i].upper = 1

    G[i] = model.Intermediate(G1[i]+G2[i]+Gg[i])
    d[i] = model.Intermediate((E[i]-x)**2+(G[i]/2)**2)
    f[i] = model.Intermediate((1-(1-(G[i]*G1[i]/(2*d[i])))*model.cos(2*phi)-((E[i]-x)*G[i]/d[i])*model.sin(2*phi)))

sigma_sum = model.Intermediate(2*math.pi*gj/k_alfa * (model.sum(f)))

y = model.Var()

model.Equation(y == model.exp(-n*sigma_sum))

model.Minimize(((y-z))**2)

model.options.IMODE = 2
model.options.SOLVER = 3

model.options.MAX_ITER = 1000

model.solve(disp=1)

问题排查与解决方案

一、报错原因排查

  1. 无效的中间变量数组初始化
    创建中间变量数组时使用了equation=None的方式:

    G = model.Array(model.Intermediate, num_pulses_in_window, equation=None)
    d = model.Array(model.Intermediate, num_pulses_in_window, equation=None)
    f = model.Array(model.Intermediate, num_pulses_in_window, equation=None)
    

    GEKKO不支持这种预创建空Intermediate数组再赋值的操作,会生成无有效表达式的空中间变量,导致模型解析时出现none元素报错。正确做法是在循环中逐个创建中间变量并添加到列表:

    G = []
    d = []
    f = []
    for i in range(num_pulses_in_window):
        # ... 变量边界设置代码
        G_i = model.Intermediate(G1[i]+G2[i]+Gg[i])
        G.append(G_i)
        d_i = model.Intermediate((E[i]-x)**2+(G_i/2)**2)
        d.append(d_i)
        f_i = model.Intermediate((1-(1-(G_i*G1[i]/(2*d_i)))*model.cos(2*phi)-((E[i]-x)*G_i/d_i)*model.sin(2*phi)))
        f.append(f_i)
    
  2. 维度不匹配风险
    x是长度为4的Param数组,E[i]是单个Var变量,E[i]-x会生成长度为4的数组;phi同样是长度为4的数组,后续f[i]的计算中,单个Var与数组运算会产生维度不匹配问题,这也是可能引发解析错误的原因,需核对模型逻辑是否需针对每个数据点单独计算,或调整维度使运算匹配。

  3. 函数混用问题
    计算sigma_sum时使用了Python标准库的math.pi,虽为常数,但建议统一使用GEKKO内置常数model.pi,避免潜在的类型兼容问题:

    sigma_sum = model.Intermediate(2*model.pi*gj/k_alfa * (model.sum(f)))
    

二、APM文件位置查找

Jupyter环境中,GEKKO默认将APM文件存储在临时目录,可通过model.path属性获取具体路径:

print(model.path)

执行后会输出模型文件所在的临时文件夹路径,里面包含生成的APM相关文件。

内容的提问来源于stack exchange,提问作者twistfire

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 00:20:24