首页 > 解决方案 > 在约束中使用变量相关函数

问题描述

我正在尝试使用 gekko 优化以下问题: 在此处输入图像描述

问题是问题的动态包含一个术语kappa,它取决于s但我在它们之间提供的唯一关系是s中每个离散点的kappa数据。

我还试图以离散和连续形式来表述我的问题,看看哪个运行得更快。我的尝试是将kappa估计为s using的函数,cspline但我在将其应用于两者的约束时都遇到了错误。你可以看到下面的代码:

在离散时间:

now = time.time()
p = GEKKO(remote=False)

sg = []
rhog = []
thetag = []
betag = []
vg = []
ag = []
curvg = [] #kappa

#parameters
T = p.Const(value=0.5)
vref = p.Const(value=3)
nT = 11

#kappa and s reference
arcref = refpath[2,minid:]-refpath[2,minid]
curvref = refpath[3,minid:]

for i in range(nT):
    #Set variables
    sg.append(p.Var(value = sinit))
    rhog.append(p.Var(value = rhoinit))
    thetag.append(p.Var(value = 0))
    betag.append(p.Var(value = 0))
    vg.append(p.Var(value = 0))
    ag.append(p.Var(value = 0))
    curvg.append(p.Var())
    
    #Set objective function
    p.Obj(rhog[i]**2 + (vg[i]- vref)**2 + ag[i]**2)
    
    #Estimate kappa
    p.cspline(sg[i], curvg[i], arcref, curvref)

for i in range(nT-1):
    #Set constraints
    p.Equation( vg[i+1] == vg[i] + T*ag[i] )
    p.Equation( sg[i+1] == sg[i] + T*vg[i]*p.sin(thetag[i]) )
    p.Equation( rhog[i+1] == rhog[i] + T*vg[i]*p.cos(thetag[i])/(1-rhog[i]*curvg) )
    p.Equation( thetag[i+1]-betag[i+1]+curvg[i+1]*sg[i+1] == thetag[i]-betag[i]+curvg[i]*sg[i] )

p.options.IMODE = 3
p.options.SOLVER = 3
p.options.WEB = 0

p.solve(disp=False, debug=True)
print(f'run time: {time.time()-now}')

我得到了错误

Exception: @error: Model Expression
 *** Error in syntax of function string: Missing operator

Position: 2                   
 0,0,0,0,0,0,0,0,0,0,0
  ?

在连续时间内:

now = time.time()
p = GEKKO(remote=False)

#Set variables
sg = p.Var(value=sinit)
rhog = p.Var(value=rhoinit)
vg = p.Var(value=0)
ag = p.Var(value=0)
thetag = p.Var(value=0)
betag = p.Var(value=0)

curvg = p.Var()
#Parameters
T = 0.5
vref = p.Const(value=3)
nT = 11

#kappa and s reference
arcref = refpath[2,minid:]-refpath[2,minid]
curvref = refpath[3,minid:]

p.time = np.linspace(0,nT,nT*2)

p.options.IMODE = 6
p.options.SOLVER = 3
p.options.WEB = 0

p.Obj( rhog**2 + (vg - vref)**2 + ag**2 )

#set kappa estimate
p.cspline(sg, curvg, arcref, curvref)

p.Equation(sg.dt()==vg*p.cos(thetag)/(1-rhog*curvg))
p.Equation(rhog.dt()==vg*p.sin(thetag))
p.Equation(vg.dt()==ag)
p.Equation(thetag.dt()==betag.dt()-curvg*sg.dt())

p.solve(disp=False, debug=True)
print(f'run time: {time.time()-now}')

我得到了错误:

Error: free(): invalid size

Program received signal SIGABRT: Process abort signal.

Backtrace for this error:
#0  0x6c278f
#1  0x6aacd0
#2  0x7f95ba478fcf
#3  0x7f95ba478f47
#4  0x7f95ba47a8b0
#5  0x7f95ba4c3906
#6  0x7f95ba4ca979
#7  0x7f95ba4d1e9b
#8  0x4f54a6
#9  0x4f66cb
#10  0x50802b
#11  0x5165af
#12  0x52661f
#13  0x449776
#14  0x449d6f
#15  0x4472e2
#16  0x66d119
#17  0x4026ec
#18  0x7f95ba45bb96
#19  0x40275c
#20  0xffffffffffffffff

Error: 'results.json' not found. Check above for additional error details

标签: pythongekko

解决方案


我无法复制您的问题,因为它缺少一些输入。这是一个在 Windows 和 Linux 上都能成功运行的版本。

from gekko import GEKKO
import time
import numpy as np

now = time.time()
p = GEKKO(remote=False)

#Set variables
sg = p.Var()
rhog = p.Var()
vg = p.Var(value=0)
ag = p.Var(value=0)
thetag = p.Var(value=0)
betag = p.Var(value=0)

curvg = p.Var()
#Parameters
T = 0.5
vref = p.Const(value=3)
nT = 11

#kappa and s reference
arcref = [-1,0,1,2,3,4,5,6]
curvref = [1,2,1,2,1,2,1,2]

p.time = np.linspace(0,nT,nT*2)

p.options.IMODE = 6
p.options.SOLVER = 3
p.options.WEB = 0

p.Obj( rhog**2 + (vg - vref)**2 + ag**2 )

#set kappa estimate
p.cspline(sg, curvg, arcref, curvref)

p.Equation(sg.dt()==vg*p.cos(thetag)/(1-rhog*curvg))
p.Equation(rhog.dt()==vg*p.sin(thetag))
p.Equation(vg.dt()==ag)
p.Equation(thetag.dt()==betag.dt()-curvg*sg.dt())

p.solve(disp=False, debug=True)
print('sg: ' + str(sg.value))
print('curvg: ' + str(curvg.value))
print(f'run time: {time.time()-now}')

我将cspline输入更改为样本数据并初始化sgrhog更改为默认值 ( 0)。确保cspline有一个单调递增的因变量。


推荐阅读