python - 在约束中使用变量相关函数
问题描述
问题是问题的动态包含一个术语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
解决方案
我无法复制您的问题,因为它缺少一些输入。这是一个在 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
输入更改为样本数据并初始化sg
并rhog
更改为默认值 ( 0
)。确保cspline
有一个单调递增的因变量。
推荐阅读
- python - 使用 zip 函数处理字典在 Python 中保持相同的结构
- sql - 如何使用 PowerShell 从 SQL Server 中的 .csv 导入数据?- 问题
- python - 如何将嵌套的 JSON 数据从 URL 转换为 Pandas 数据框
- ruby-on-rails - 如果允许有效重叠,如何计算预订
- regex - 从 RDBMS 表的列中的客户端标识符中排除日期列的模式
- r - 从源代码编译 R:如果直接启动,RStudio 找不到库
- c - 关于我在 Tideman 中实现 lock_pairs 函数的问题
- python - 检测来自麦克风的音频
- reactjs - 将 react-charts 函数组件示例转换为类组件
- mysql - 如何根据同一列中的两个条件进行过滤