# conditionals
c1 = m.if3(a/b-10,1,0) # check if a/b>10
c2 = m.if3(10-a*b,1,0) # check if a*b<=10
字符串 这些开关变量可以用来计算X。
# output
# when c1=0 (a/b>10), X=0
# when c1=1 (a/b<10) and c2=1 (a*b>10), X=a-b
# when c1=1 (a/b<10) and c2=0 (a*b<10), X=1
X = m.Var()
m.Equation(X==c1*c2*(a-b) + c1*(1-c2)*(1))
型
的数据 下面是模拟中这个简单测试用例的完整脚本,其中a的值是一个值范围。
from gekko import GEKKO
m = GEKKO(remote=False)
a = m.Param([0.5,1,2,3,4,6,8,12,15,20,30,40,50])
b = 2
d = m.Intermediate(a/b); e=m.Intermediate(a*b)
# conditionals
c1 = m.if3(a/b-10,1,0) # check if a/b>10
c2 = m.if3(10-a*b,1,0) # check if a*b<=10
# output
# when c1=0 (a/b>10), X=0
# when c1=1 (a/b<10) and c2=1 (a*b>10), X=a-b
# when c1=1 (a/b<10) and c2=0 (a*b<10), X=1
X = m.Var()
m.Equation(X==c1*c2*(a-b) + c1*(1-c2)*(1))
# solve
m.options.IMODE=2
m.solve(disp=True)
print(a.value)
print(X.value)
# generate plot of results
import matplotlib.pyplot as plt
plt.subplot(4,1,1)
plt.plot(a.value,X.value,'b-o',label='X')
plt.legend(); plt.grid()
plt.subplot(4,1,2)
plt.plot(a.value,d.value,'k-o',label='a/b')
plt.plot([0.5,50],[10,10],'k--')
plt.legend(); plt.grid()
plt.subplot(4,1,3)
plt.plot(a.value,e.value,'r-o',label='a*b')
plt.plot([0.5,50],[10,10],'r--')
plt.legend(); plt.grid()
plt.subplot(4,1,4)
plt.plot(a.value,c1.value,'k:x',label='c1 (a/b<10)')
plt.plot(a.value,c2.value,'r:x',label='c2 (a*b<10)')
plt.legend(); plt.grid(); plt.xlabel('a')
plt.tight_layout(); plt.savefig('results.png',dpi=300)
plt.show()
型 这现在可以用于优化以最大化、最小化或达到X的目标值,例如调整a的值以最大化X:
from gekko import GEKKO
m = GEKKO(remote=False)
a = m.Var(lb=0,ub=100)
b = 2
d = m.Intermediate(a/b); e=m.Intermediate(a*b)
# conditionals
c1 = m.if3(a/b-10,1,0) # check if a/b>10
c2 = m.if3(10-a*b,1,0) # check if a*b<=10
# output
# when c1=0 (a/b>10), X=0
# when c1=1 (a/b<10) and c2=1 (a*b>10), X=a-b
# when c1=1 (a/b<10) and c2=0 (a*b<10), X=1
X = m.Var()
m.Equation(X==c1*c2*(a-b) + c1*(1-c2)*(1))
m.Maximize(X)
# solve
m.options.IMODE=3
m.solve(disp=True)
print(f'a={a.value[0]}')
print(f'X={X.value[0]}')
2条答案
按热度按时间4ktjp1zp1#
逻辑约束可以通过带有二进制开关变量的
m.if3()
(或m.if2()
MPCC形式)来实现。字符串
这些开关变量可以用来计算
X
。型
的数据
下面是模拟中这个简单测试用例的完整脚本,其中
a
的值是一个值范围。型
这现在可以用于优化以最大化、最小化或达到
X
的目标值,例如调整a
的值以最大化X
:型
这给出了正确的解决方案:
型
请注意,在Gekko中,
>
和>=
对于数值优化是等价的。a=20.0
的解是在X=a-b
和X=0
之间的切换条件下。模拟结果显示X=0
在a=20
,而优化结果显示X=18
在a=20
。有默认的求解器容差(m.options.RTOL
用于方程,m.options.RTOL
用于目标),允许在正确答案的1e-6
范围内求解。1zmg4dgp2#
这就是你想要的吗?
字符串