首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Gekko优化并没有给我一个唯一的答案,尽管我的模型有一个独特的答案

Gekko优化并没有给我一个唯一的答案,尽管我的模型有一个独特的答案
EN

Stack Overflow用户
提问于 2022-05-24 10:09:56
回答 1查看 93关注 0票数 2

我的优化模型有效,但是主变量(Pre)的初始值不同,它给出了不同的答案!不是最理想的!但这应该有一个答案。我不明白为什么!

代码语言:javascript
运行
复制
try:
    from pip import main as pipmain
except:
   from pip._internal import main as pipmain
pipmain(['install','gekko'])

from gekko import GEKKO    
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt


#Initialize Model
m = GEKKO(remote=False)

#define parameter
df=pd.read_excel (r'C:\Users\....')
Pw=pd.DataFrame(df).values
eta = m.Const(value=0.6)
Pre=m.Var(lb=20, ub=30)
Pre.value=23


def f(Pw,Pre):
    Dplus=m.Var(value=0)
    Dminus=m.Var(value=0)
    for i in range(744):
       D=float(Pw[i])-Pre.value
       if D>=0:
          Dplus.value=Dplus.value+D*eta.value
       elif D<0:
          Dminus.value=Dminus.value+D
    return Dplus+Dminus

#constraint:
m.Equation(f(Pw,Pre)>=0)

#Objective:
m.Minimize(f(Pw,Pre))

#设置全局选项: m.options.IMODE =2#稳态优化

#求解模拟: m.solve()

EN

回答 1

Stack Overflow用户

发布于 2022-05-30 06:49:02

您不应该使用.value来构建模型方程,因为它只引用初始猜测值,而不是变量值。使用m.if3() (首选)或m.if2()函数在模型中使用条件语句。下面是m.if3()的一个示例

代码语言:javascript
运行
复制
import numpy as np
import matplotlib.pyplot as plt
from gekko import GEKKO
m = GEKKO(remote=False)
p = m.Param()
y = m.if3(p-4,p**2,p+1)

# solve with condition<0
p.value = 3
m.solve(disp=False)
print(y.value)

# solve with condition>=0
p.value = 5
m.solve(disp=False)
print(y.value)

合并条件语句的一个更好的方法是使用松弛变量。在eta给出的存储过程中存在效率低下的情况下,您的应用程序似乎用于能量存储。下面是一个简单储能问题 (参见问题4),其中存储和检索的损失嵌入到优化中。

代码语言:javascript
运行
复制
from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt

m = GEKKO(remote=False)
m.time = np.linspace(0,1,101)

g = m.FV(); g.STATUS = 1 # production
s = m.Var(1e-2, lb=0)    # storage inventory
store = m.Var()          # store energy rate
s_in = m.Var(lb=0)       # store slack variable
recover = m.Var()        # recover energy rate
s_out = m.Var(lb=0)         # recover slack variable
eta = 0.7
d = m.Param(-2*np.sin(2*np.pi*m.time)+10)
m.periodic(s)
m.Equations([g + recover/eta - store >= d,
             g - d == s_out - s_in,
             store == g - d + s_in,
             recover == d - g + s_out,
             s.dt() == store - recover/eta,
             store * recover <= 0])
m.Minimize(g)

m.options.SOLVER   = 1
m.options.IMODE    = 6
m.options.NODES    = 3
m.solve()

plt.figure(figsize=(6,3))
plt.subplot(2,1,1)
plt.plot(m.time,d,'r-',label='Demand')
plt.plot(m.time,g,'b:',label='Prod')
plt.legend(); plt.grid(); plt.xlim([0,1])

plt.subplot(2,1,2)
plt.plot(m.time,s,'k-',label='Storage')
plt.plot(m.time,store,'g--', label='Store Rate')
plt.plot(m.time,recover,'b:', label='Recover Rate')
plt.legend(); plt.grid(); plt.xlim([0,1])
plt.show()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72361040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档